没有释放堆

时间:2017-02-09 06:14:16

标签: c++ string windows win32gui

我有一个Win32控制台应用程序。当我运行该代码时,它会在近60%的时间内抛出此异常。

x.exe中0x777BC799(ntdll.dll)的未处理异常:0xC0000374:堆已损坏(参数:0x777E8890)。

void function(CString &outputStr, const char* name, DWORD64 value){
    outputStr = _T("");
    CString csName(name);
    outputStr.Format(_T("<name=\"%s\" value=\"0x%08x\"/>\n"), csName, value);
}

这是崩溃发生的功能之一(在最后一行)。当我看到堆栈跟踪时,它有点像这样:

ntdll.dll!_RtlpHeapHandleError@4()  
ntdll.dll!_RtlpLogHeapFailure@24()  
ntdll.dll!@RtlpLowFragHeapFree@12() 
ntdll.dll!_RtlFreeHeap@12() Unknown
abc.exe!ATL::CWin32Heap::Free(void * p) Line 153    C++
abc.exe!ATL::CAtlStringMgr::Free(ATL::CStringData * pData) Line 107 C++
abc.exe!ATL::CStringData::Release() Line 92 C++
abc.exe!ATL::CSimpleStringT<char,0>::~CSimpleStringT<char,0>() Line 263 C++
abc.exe!ATL::CStringT<char,ATL::StrTraitATL<char,ATL::ChTraitsCRT<char> >       ::~CStringT<char,ATL::StrTraitATL<char,ATL::ChTraitsCRT<char> > >() Line 1295C++

发生崩溃的另一段代码是

std::string dir = "";
dir = dir + "\\" + "abc";

具有类似的堆栈跟踪。早先通过调试我看到了一种模式,即崩溃只发生在字符串操作的地方(CString或std :: string)。如堆栈中所示,当从功能块返回时,在内部调用Free函数时发生崩溃。现在我不知道为什么会这样。

1 个答案:

答案 0 :(得分:0)

问题已解决。 实际上我正在使用

找到programData文件夹
wchar_t *additionalPath = L"\\SomePath\\SomeMorePath";
wchar_t *appDataPath;
SHGetKnownFolderPath(FOLDERID_ProgramData,
    KF_FLAG_CREATE,
    NULL,
    &appDataPath) == S_OK)

PathAppend(appDataPath, additionalPath);

现在,此函数为appDataPath分配了足够的内存并将值写入其中。 PathAppend函数在内部将additionalPath附加到appDataPath。由于分配给appDataPath的内存有限,因此该函数可能附加附加字符串并将值扩展到分配的内存之外。当代码的任何其他部分访问该内存时,这会导致堆损坏。