.NET 4: может ли один только управляемый код вызвать повреждение кучи? - PullRequest
11 голосов
/ 27 сентября 2011

У меня повреждена куча в моей многопоточной управляемой программе.Делая некоторые тесты, я обнаружил, что повреждение происходит только тогда, когда фоновые потоки активны в программе (они переключаемы).Потоки используют некоторые сторонние компоненты.

После изучения кода потоков и сторонних компонентов (с .NET Reflector) я обнаружил, что все они управляются, то есть no"unsafe"или "DllImportAttribute" или "P / Invoke".Кажется, что чисто управляемый код вызывает повреждение кучи, возможно ли это?

ОБНОВЛЕНИЕ

Помимо использования класса Marshal, возможно ли повредитькуча с неправильно синхронизированными потоками ?Пример был бы очень признателен.

1 Ответ

12 голосов
/ 27 сентября 2011

Определенно возможно повредить кучу без использования небезопасного кода.Класс 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 ... :) 
...