. net 4:托管代码单独会导致堆损坏吗?

本文关键字:损坏 托管代码 单独会 net | 更新日期: 2023-09-27 18:09:44

我的多线程管理程序中有一个堆损坏。通过一些测试,我发现只有当后台线程在程序中活动时才会发生损坏(它们是可切换的)。这些线程使用一些第三方组件。

在检查了线程和第三方组件的代码(使用。net Reflector)之后,我发现它们都是管理的,即no"不安全"或"DllImportAttribute"或"p/Invoke"。似乎纯托管代码会导致堆损坏,这可能吗?

除了使用Marshal类,是否有可能由于线程没有正确同步而损坏堆?如能举个例子,不胜感激。

. net 4:托管代码单独会导致堆损坏吗?

在不使用任何不安全代码的情况下损坏堆绝对是可能的。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 ... :)