我的 C++ 代码连续运行了几次,在执行几次后突然停止运行并抛出异常(没有任何更改!),我不明白为什么。
这是代码中有问题的部分:
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
TCHAR *path;
SHGetKnownFolderPath(FOLDERID_Startup, KF_FLAG_CREATE, NULL, &path);
lstrcat(path, L"\\calc.exe");
if (CreateProcess(NULL, path, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
执行几次后,在 CreateProcess() 行上抛出 2 个异常,第一个:
Unhandled exception at 0x779D8829 (ntdll.dll) in PS_Down.exe: 0xC0000374: A heap has been corrupted (parameters: 0x77A15890).
第二个:
Exception thrown at 0x77946111 (ntdll.dll) in PS_Down.exe: 0xC0000005: Access violation reading location 0x00000069.
我在其他几个项目(不包括 CreateProcess() 函数)中发生过这种情况,我注意到当涉及 TCHAR 和 SHGetKnownFolderPath() 时,它总是发生。 非常感谢任何有助于理解如何解决问题的帮助,在此先感谢!
P.S - 我是 cpp 编码的新手,所以请尝试相应地解释
最佳答案
lstrcat(path, L"\\calc.exe");
会导致缓冲区溢出。 path
是指向数组的指针,它只能包含文件夹路径,仅此而已。您将需要分配一个宽字符串,附加文件夹路径,然后附加文件路径。此外,您还需要检查 SHGetKnownFolderPath
的结果以确定 path
是否包含有效指针,并稍后通过调用 CoTaskMemFree
释放它。
关于c++ - 相同的 C++ 代码有时有效,有时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53649485/