В вашем вопросе отсутствуют важные детали, совершенно не ясно, нужно ли освобождать память, выделенную кодом C ++, на стороне C #. Обычно это делается автоматически, скажем, с помощью маршаллера P / Invoke или уровня взаимодействия COM в CLR. Или это можно сделать вручную, объявив аргумент метода как IntPtr, а затем использовать класс Marshal.
Если это делается автоматически, вы должны использовать распределитель памяти COM, CoTaskMemAlloc (). Если вы выполняете маршалинг самостоятельно, вы также можете использовать GlobalAlloc (), выпустите на стороне C # с Marshal.FreeHGlobal (). Использование GlobalAlloc () не дает никаких преимуществ, вы также можете использовать CoTaskMemAlloc () и выпустить его вместе с Marshal.FreeCoTaskMem ().
Но ты должен был заметить это сам. Выделение с помощью malloc () или HeapAlloc () на стороне C ++ вызывает утечки вместо повреждения, если управляемый код освобождает память. Vista и Win7 имеют гораздо более строгий менеджер кучи, он завершает программу, если замечает плохой выпуск.
Мне кажется, что в вашем коде C ++ есть простое повреждение кучи. Это самая распространенная проблема неуправляемого программирования на C ++, переполнение конца буфера, запись в освобожденную память, неправильные значения указателя. Способ избавиться от подобных ошибок - тщательный анализ кода и использование распределителя отладки, такого как предоставленный <crtdbg.h>
. Удачи с этим.