.NET 4: Может ли управляемый код вызывать кучу?
У меня есть куча коррупции в моей многопоточной управляемой программе. Выполняя некоторые тесты, я обнаружил, что коррупция происходит только тогда, когда фоновые потоки активны в программе (они переключаются). В потоках используются сторонние компоненты.
После изучения кода потоков и сторонних компонентов (с .NET Reflector) я обнаружил, что все они управляются, то есть нет "небезопасно" или "DllImportAttribute" или "P/Invoke", Кажется, что чисто управляемый код вызывает повреждение кучи, возможно ли это?
UPDATE
Помимо использования класса маршала, можно ли повредить кучу, когда потоки не синхронизированы правильно? Пример будет очень оценен.
Ответы
Ответ 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 ... :)