释放/删除char*会导致无效的堆指针断言失败

Its*_*dly 5 dll interop memory-management c++-cli

我有一大堆代码用于获取CLR DLL中映射驱动器的UNC路径,但是当我在最后释放内存时,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;
Run Code Online (Sandbox Code Playgroud)

这可能是我不理解的关于内存去分配的基本内容,但无论哪种方式值得搞清楚.如果它有帮助,如果我跳过该行tpath删除罚款,但如果charpath断言失败,那么tpath也将失败.

And*_*rei 8

MSDN的相关评论是

StringToHGlobalAnsi对于自定义封送处理或混合托管代码和非托管代码非常有用.因为此方法分配字符串所需的非托管内存,所以始终通过调用FreeHGlobal释放内存.StringToHGlobalAnsi提供Marshal.PtrToStringAnsi的相反功能.

所以,没有删除/免费但是FreeHGlobal.


And*_*lov 5

对于szDeviceNametpath使用delete[]代替delete.[]version用于数组,非[] version用于单个对象.