可视C++程序在退出后崩溃
visual C++ program crashes after exit
我使用以下函数打开一个对话框,使用OPENFILENAME。问题是,打开对话框并关闭它后,一切正常,但是当我退出应用程序时,Windows说它崩溃了。
bool openDialog()
{
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for file name
HWND hwnd = NULL; // owner window
HANDLE hf; // file handle
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
//
// Set lpstrFile[0] to ' ' so that GetOpenFileName does not
// use the contents of szFile to initialize itself.
//
ofn.lpstrFile[0] = ' ';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrTitle = "Open File";
ofn.lpstrFilter = "Custom File *.Cus ";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Display the Open dialog box.
if (GetOpenFileName(&ofn) == true)
{
path = ofn.lpstrFile;
return true;
}
else
{
return false;
}
}
我注意到这是对话框,因为只有在运行时使用它才会发生崩溃,这意味着当我关闭应用程序而不在某个时候打开对话框时,它会成功退出。
无论如何,据我研究,这可能是导致我的"堆损坏"或我不太了解的类似事情,所以当我的应用程序尝试关闭时,它不会释放内存应有的(?如果有人能找到解决方案,将不胜感激。
如果这只是在函数外部声明的const char *
或char *
,则问题很可能与path
有关。
当 openDialog
函数返回时,类型 OPENFILENAME
和字符数组的ofn
结构szFile
超出范围(以及所有其他局部堆栈分配的变量(,并且不再有效。因此,ofn.lpstrFile
并因此指向path
的字符数组不再有效。
您应该在函数外部为文件名分配空间,并在从函数返回之前使用 strcpy
、strncpy
或等效项执行复制。另一种方法是将szFile
字符数组移出函数并作为成员变量移动到包含类中。无论哪种方式,包含返回的文件名的字符数组的作用域都需要超出 openDialog
函数执行的生存期。
相关文章:
- 程序过早结束,可能已经崩溃了.退出代码0xc0000005
- C++程序在退出时崩溃
- 全局范围内的对象会导致程序退出时崩溃
- 为什么C Pthread自行退出而没有过程崩溃
- C 程序用退出代码崩溃:9(Sigkill)
- 为什么全局或静态对象会导致程序退出时崩溃
- Boost 测试在使用 Clang 4.1 (LLVM 3.1svn) 退出时崩溃
- 退出应用程序时崩溃
- DirectShow 代码在退出后崩溃(PushSourceDesktop 示例)
- 在DLL中提供的ZeroMQ上下文单例在程序退出时崩溃(VS2010 win7 x64 zmq 4.0x)
- 为什么我的安卓应用在线程退出时崩溃
- OpenCV程序在退出时崩溃linux(使用cvtColor)
- 可视C++程序在退出后崩溃
- 退出后代码崩溃
- 崩溃或被迫退出后,C++动态分配的内存返回
- 试图调试TensorFlow c++代码时,GDB退出/崩溃
- 我的win32程序是否有办法告诉它启动的子进程已经崩溃(而不仅仅是退出)?
- CallWindowProc退出时崩溃
- 应用程序退出时CEF崩溃(QT5+CEF3.2526)
- Exe在c++中退出该方法后崩溃