我有一个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函数时发生崩溃。现在我不知道为什么会这样。
答案 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的内存有限,因此该函数可能附加附加字符串并将值扩展到分配的内存之外。当代码的任何其他部分访问该内存时,这会导致堆损坏。