我的多线程托管程序中存在堆损坏。做一些测试我发现只有当程序中的后台线程处于活动状态时才会发生损坏(它们是可切换的)。线程使用一些第三方组件。
在检查了线程和第三方组件的代码(使用.NET Reflector)后,我发现它们都是托管的,即 没有 “不安全”或“DllImportAttribute”或“P / Invoke”。似乎纯托管代码导致堆损坏,这可能吗?
UPDATE
除了使用Marshal类, 是否有可能在线程未正确同步的情况下破坏堆?一个例子将非常感激。
我的多线程托管程序中存在堆损坏。做一些测试我发现只有当程序中的后台线程处于活动状态时才会发生损坏(它们是可切换的)。线程使用一些第三方组件。
在检查了线程和第三方组件的代码(使用.NET Reflector)后,我发现它们都是托管的,即 没有 “不安全”或“DllImportAttribute”或“P / Invoke”。似乎纯托管代码导致堆损坏,这可能吗?
UPDATE
除了使用Marshal类, 是否有可能在线程未正确同步的情况下破坏堆?一个例子将非常感激。
绝对有可能在不使用不安全代码的情况下破坏堆。元帅阶级是你的朋友/敌人
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 ... :)