【问题标题】:Free/delete a char* causes an invalid heap pointer assertion failure释放/删除 char* 导致无效的堆指针断言失败
【发布时间】: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


【解决方案1】:

MSDN的相关评论是

StringToHGlobalAnsi 对于自定义编组或混合时很有用 托管和非托管代码。因为这种方法分配 字符串所需的非托管内存,始终通过以下方式释放内存 调用 FreeHGlobal。 StringToHGlobalAnsi 提供相反的 Marshal.PtrToStringAnsi 的功能。

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

【讨论】:

  • @its 不会改变问题。接受答案。
  • 在 C++ 中,您可能需要GlobalFree。但绝对分配器和释放器必须匹配。
【解决方案2】:

对于szDeviceNametpath,使用delete[] 而不是delete[] 版本用于数组,非[] 版本用于单个对象。

【讨论】:

    【解决方案3】:

    根据MSDN,您应该使用FreeHGlobal 释放内存

    【讨论】:

      【解决方案4】:

      这是错误的:

      free(charpath);
      

      由于charpath 是由StringToHGlobalAnsi 分配的,您应该调用FreeHGlobal。像这样:

      Marshal::FreeHGlobal(IntPtr(charpath));
      

      【讨论】:

        猜你喜欢
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        • 2018-07-30
        • 1970-01-01
        • 2012-07-23
        • 1970-01-01
        相关资源
        最近更新 更多