Когда я вызываю неуправляемый код на C++ из моего кода на C#, у меня, похоже, есть какая-то утечка памяти.
C++ читает данные из файла, используя ifstream.read, и записывает его в вектор.утечка памяти при вызове неуправляемого кода из управляемого кода в Windows 7
Это происходит только после обновления до Windows 7, не происходит в Vista, но если я использую версию родной DLL, которая была скомпилирована в Vista, это ничего не меняет!
Если я запускаю тот же код на C++ напрямую, без управляемого взаимодействия, утечки памяти нет!
Если я запускаю управляемый процесс, но внутри процесса 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).
У кого-нибудь есть идея, в чем причина этого?
Также, если кто-нибудь знает о встроенном профилировании памяти, который работает в Window 7, я был бы рад узнать (на данный момент я только что напечатал для консоли все явное выделение памяти и нет различий).
LeakDiag [http://mcfunley.com/277/using-leakdiag-to-debug-unmanaged-memory-leaks] или AutomatedQA AQTime может выполнять неуправляемый анализ утечки. –
Какой счетчик производительности вы используете для измерения потребления памяти? –
Вы отметили вопрос "vshost.exe". Выполняется ли приложение под Visual Studio при измерении потребления памяти? –