【发布时间】:2011-07-19 21:29:27
【问题描述】:
我有一段代码用于获取 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;
这可能是我不了解的有关内存释放的基本内容,但无论哪种方式都值得弄清楚。如果它有帮助,如果我跳过该行 tpath 删除很好,但如果 charpath 断言失败,那么 tpath 也会失败。
【问题讨论】:
-
您对此进行了分析吗?你知道有内存泄漏吗?
-
memset(tpath, '\0', MAX_DEVICE_ LENGTH);只初始化一半数组
标签: dll interop c++-cli memory-management