Освобождение / удаление символа * вызывает сбой утверждения неверного указателя кучи

У меня есть кусок кода, который я использую для получения UNC-пути подключенного диска в CLR DLL, но когда я ' m освобождая память в конце, массив char вызывает ошибку утверждения неверного указателя кучи, и я предполагаю, что это связано с тем, что он выделяется InteropServices, но я хочу убедиться, что это не превратится в утечку памяти, поскольку эта функция вызывается неоднократно.

Код:

DWORD MAX_DEVICE_LENGTH = 1000;
TCHAR* szDeviceName = new TCHAR[MAX_DEVICE_LENGTH];
memset(szDeviceName, '\0', MAX_DEVICE_LENGTH); 
DWORD dwResult; 


char* charpath = (char*)   (void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(path->Substring(0,2));
wchar_t* tpath = new wchar_t[MAX_DEVICE_LENGTH];

memset(tpath, '\0', MAX_DEVICE_LENGTH);

DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, charpath, -1, NULL, 0);
MultiByteToWideChar (CP_ACP, 0, charpath, -1, tpath, dwNum );


dwResult = WNetGetConnection(
    tpath,
    szDeviceName, &MAX_DEVICE_LENGTH); 

System::String ^ str = gcnew System::String(szDeviceName);

str += path->Substring(2, path->Length-2);

delete(szDeviceName);
free(charpath); //This is where it assert-fails
delete(tpath);

return str;

Возможно, это что-то базовое в освобождении памяти, чего я не понимаю, но в любом случае это стоит выяснить. Если это поможет, если я пропущу эту строку, tpath удалит нормально, но если утверждение charpath завершится ошибкой, то tpath также не сработает.

5
задан ildjarn 19 July 2011 в 22:58
поделиться