当我退出C ++程序时,它会崩溃,例如:
EAccessViolation with mesage 'Access violation at address 0...
and
Abnormal Program Termination
它可能是由一些析构函数引起的,因为它只在应用程序退出时才会发生。我使用了一些外部库,但找不到导致它的代码。是否有一个强制立即退出程序的函数(类似Linux中的kill),以便操作系统必须释放内存?我可以在app退出事件中使用此功能。
我知道这将是一个糟糕的解决方案,因为它只是隐藏了问题。
我只是出于纯粹的好奇心,所以请不要给我-1:)
我从stdlib尝试exit(0)
,但没有帮助。
编辑:
感谢您的众多回复:) 我使用Builder C ++ 6(我知道它已经过时但由于某些原因我不得不使用它)。我的应用程序使用库到神经网络(FANN)。使用调试器我发现程序崩溃:
~neural_net()
{
destroy();
}
destroy()多次调用另一个函数fann_safe_free(ptr),即:
#define fann_safe_free(x) {if(x) { free(x); x = NULL; }}
图书馆效果很好,只有在清理时才会出现问题。这就是为什么我问这么残酷的解决方案。我的应用程序是多线程的,但其他线程对不同的数据进行操作。
我会在第n次分析我的代码(错误必须在某处),感谢您的所有提示:)
答案 0 :(得分:7)
你应该解决问题。
但是否则你可以中止
注意:abort用于Abnormal
程序终止。
abort()
区别:(注意让应用程序离开main函数相当于exit())
出口()
- 按照注册的相反顺序调用使用atexit(3)函数注册的函数。这包括销毁所有全局(静态存储持续时间)变量。
- 刷新所有打开的输出流。
- 关闭所有打开的流。
- 取消链接使用tmpfile(3)函数创建的所有文件。
醇>
中止()
- 刷新所有打开的输出流。
- 关闭所有打开的流。
醇>
答案 1 :(得分:4)
这不是一个原因,这是一个可怕的解决方案。它会隐藏问题(可能),但它也可能会破坏数据,具体取决于应用程序的性质。
为什么不使用调试器并尝试找出导致错误的原因?
如果您的应用程序是多线程的,则应确保在退出应用程序之前正确关闭所有线程。当后台线程试图使用已经被破坏的内存/对象时,这是退出时出现此类错误的一个相当常见的原因。
编辑:
根据您更新的问题,我有以下建议:
尝试更具体地找出导致析构函数崩溃的原因。
我要做的第一件事就是确保它不会试图破坏NULL对象。当您在调试器中的~sygnical_net中发生崩溃时,请检查“this”指针以确保它不是NULL。如果是,则检查你的调用堆栈并查看它被破坏的位置,并在调用delete之前进行检查以确保它不是NULL。
如果它不是NULL,那么我会在destroy中展开该宏,这样你就可以看到它是否在免费调用时崩溃了。
答案 2 :(得分:2)
您可以尝试拨打abort();
(在<stdlib.h>
和<process.h>
中声明)
然而,VisualC ++中的版本将在退出时打印一条警告消息:“此应用程序已请求Runtime以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。“
答案 3 :(得分:1)
在Linux / UNIX上,您可以使用 _exit
:
#include <unistd.h> void _exit(int status);
函数
_exit()
与exit()
类似,但不会调用在atexit()
或on_exit()
注册的任何函数。它是否刷新标准I / O缓冲区并删除使用tmpfile(3)
创建的临时文件是依赖于实现的。另一方面,_exit()
会关闭打开的文件描述符,这可能会导致未知的延迟,等待挂起的输出完成。如果延迟是不受欢迎的,在调用tcflush()
之前调用_exit()
之类的函数可能会很有用。是否取消任何挂起的I / O,以及_exit()
可能取消哪些挂起的I / O,取决于实现。
答案 4 :(得分:1)
你是否一步一步地尝试了令人毛骨悚然的事情?如果您的项目/解决方案很简单,那么您可以尝试对其进行分段,假设您使用模块化构建并单独测试每个组件。没有任何代码或可见的析构函数,我可以给你抽象的建议,我很害怕。但是,我希望尽量减少调试字段会有所帮助。
获得答案祝你好运:)
答案 5 :(得分:0)
即时程序退出(是的,这是一个可怕的解决方案)是abort()
答案 6 :(得分:0)
这很可能是因为正在访问NULL指针。根据您的操作系统尝试获取堆栈跟踪并确定罪魁祸首,不要只是退出。
答案 7 :(得分:0)
如果你使用linux,valgrind应该解决你的问题。 但如果是windows,请尝试以下方法之一:MemoryValidator,BoundsChecker或其他类似工具。
简单地关闭你的应用程序并不是处理bug的最佳方法......