我的多线程托管程序中出现堆损坏。进行一些测试后,我发现仅当后台线程在程序中处于活动状态(它们是可切换的)时才会发生损坏。这些线程使用一些第三方组件。
在检查了线程和第 3 方组件的代码(使用 .NET Reflector)后,我发现它们都是托管的,即no“不安全”或“DllImportAttribute”或“P/Invoke”。似乎纯托管代码会导致堆损坏,这可能吗?
UPDATE
除了使用元帅级之外,是否有可能因线程未正确同步而损坏堆?一个例子将非常感激。
在不使用任何不安全代码的情况下绝对有可能损坏堆。元帅级是你的朋友/敌人
IntPtr ptr = new IntPtr(50000); // Random memory
byte[] b = new byte[100];
Marshalp.Copy(b, 0, ptr, 100);
这实际上将 100 个连续的 0 复制到地址 50000 处的堆中。
另一种方法是使用显式结构布局
[StructLayout(LayoutKind.Explicit)]
struct S1
{
[FieldOffset(0)]
internal string str;
[FieldOffset(0)]
internal object obj;
}
S1 s = new S1();
s.obj = new Program();
s.str.Trim(); // Hope that works ... :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)