C# .NET4:托管代码本身是否会导致堆损坏?

C# .NET4:托管代码本身是否会导致堆损坏?,c#,debugging,heap-corruption,C#,Debugging,Heap Corruption,我的多线程托管程序中存在堆损坏。通过一些测试,我发现只有当后台线程在程序中处于活动状态时(它们是可切换的),才会发生损坏。线程使用一些第三方组件 在检查线程和第三方组件(使用.NET Reflector)的代码后,我发现它们都是受管理的,即否“不安全”或“DllImportAttribute”或“p/Invoke”。看起来纯托管代码会导致堆损坏,这可能吗 更新 除了使用封送处理类外,是否可能在线程未正确同步的情况下损坏堆?请举个例子。在不使用任何不安全代码的情况下,肯定有可能损坏堆。元帅班是你的

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

在检查线程和第三方组件(使用.NET Reflector)的代码后,我发现它们都是受管理的,即“不安全”或“DllImportAttribute”或“p/Invoke”。看起来纯托管代码会导致堆损坏,这可能吗

更新


除了使用封送处理类外,是否可能在线程未正确同步的情况下损坏堆?请举个例子。

在不使用任何不安全代码的情况下,肯定有可能损坏堆。元帅班是你的朋友/敌人

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 ... :) 

仅仅因为它们都是托管的,并不意味着一切都是线程安全的。您是否确保代码以线程安全的方式执行,在需要时使用锁等?还有封送处理类方法可以做到这一点。@ChrisDunaway,您是说不正确的锁或以非线程安全的方式执行线程,即使不使用封送处理类,也会损坏堆?我的答案是这是不可能的().Re。structs,common
[StructLayout(LayoutKind.Sequential)]
不会导致堆损坏,对吗?@net\u prog no,
LayoutKind.Explicit
是此技巧工作/崩溃所必需的:)@net\u prog通常托管代码不可能损坏堆。这些只是一些。。。可能导致它的极端情况。有可能但不太可能遇到CLR错误。您认为最后一个响应如何?有没有一种方法可以在线程未正确同步的情况下执行此操作?