Когда я вызываю неуправляемый код C ++ из моего кода C #, у меня возникает какая-то утечка памяти.
C ++ читает данные из файла, используя ifstream.read, и записывает их в вектор.
Это происходит только после обновления до Windows 7, не происходит в Vista, но если я использую версию родной dll, скомпилированной в Vista, это ничего не изменит!
Если я запускаю тот же самый код C ++ напрямую, без управляемого interope, утечки памяти нет!
Если я запускаю управляемый процесс, но внутри процесса vshost, утечки памяти нет!
Вот подпись звонка:
[DllImport(DllPath, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool MyMethod(
int x,
string y,
string z,
bool v,
bool w);
и родной:
MyDll_Export bool APIENTRY MyMethod(
int x,
const wchar_t* y,
const wchar_t* z,
bool v,
bool w)
Когда я вызываю это из C ++, я называю это так:
MyMethod(1, L"My String 1", L"My String 2", true, true)
Когда я смотрю на счетчики производительности для управляемой и неуправляемой памяти, я вижу, что вся память поступает из неуправляемого кода.
Учитывая, что маршалинг довольно прост, я не понимаю, почему существует разница между вызовом C ++ напрямую или через C #.
Я также не знаю, почему это произошло бы только в Windows 7 (обе установки Windows имели .net 3.5 SP1).
У кого-нибудь есть идея, в чем причина этого?
Также, если кто-нибудь знает собственный инструмент для профилирования памяти, который работает в Windows 7, я был бы рад узнать (сейчас я только что распечатал на консоли все явное распределение памяти, и нет никаких отличий).