Подтвердить что ты не робот

.NET 4: Может ли управляемый код вызывать кучу?

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

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

UPDATE

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

4b9b3361

Ответ 1

Это определенно возможно повредить кучу без использования небезопасного кода. Маршал класс ваш друг/враг здесь

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