[英]How to terminate program in C++
当我退出我的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次分析我的代码(错误必须在某处),感谢您的所有提示:)
你应该解决这个问题。
但否则你可以中止。
注意:abort用于Abnormal
程序终止。
abort()
区别:(注意让应用程序离开main函数相当于exit())
出口()
- 使用atexit(3)函数注册的函数按其注册的相反顺序调用。 这包括销毁所有全局(静态存储持续时间)变量。
- 刷新所有打开的输出流。
- 关闭所有打开的流。
- 取消链接使用tmpfile(3)函数创建的所有文件。
中止()
- 刷新所有打开的输出流。
- 关闭所有打开的流。
由于不止一个原因,这是一个可怕的解决方案。 它会隐藏问题(可能),但它也可能会破坏数据,具体取决于应用程序的性质。
为什么不使用调试器并尝试找出导致错误的原因?
如果您的应用程序是多线程的,则应确保在退出应用程序之前正确关闭所有线程。 当后台线程尝试使用已经被破坏的内存/对象时,这是退出时出现此类错误的一个相当常见的原因。
编辑:
根据您更新的问题,我有以下建议:
尝试更具体地找出导致析构函数崩溃的原因。
我要做的第一件事就是确保它不会尝试破坏NULL对象。 当您在调试器中的~sygnical_net中发生崩溃时,请检查“this”指针以确保它不是NULL。 如果是,则检查您的调用堆栈并查看它被破坏的位置,并在调用delete之前进行检查以确保它不是NULL。
如果它不是NULL,那么我将在destroy中展开该宏,这样你就可以看到它是否在免费调用时崩溃了。
你可以尝试调用abort();
(在<stdlib.h>
和<process.h>
)
但是,VisualC ++中的版本将在退出时打印一条警告消息:“ 此应用程序已请求Runtime以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。 ”
在Linux / UNIX上,您可以使用_exit
:
#include <unistd.h> void _exit(int status);
函数
_exit()
与exit()
类似,但不调用使用atexit()
或on_exit()
注册的任何函数。 它是否刷新标准I / O缓冲区并删除使用tmpfile(3)
创建的临时文件是依赖于实现的。 另一方面,_exit()
会关闭打开的文件描述符,这可能会导致未知的延迟,等待挂起的输出完成。 如果延迟是不希望的,在调用_exit()
之前调用tcflush()
类的函数可能会很有用。 是否取消任何挂起的I / O,以及_exit()
可能取消哪些挂起的I / O,取决于实现。
你一步一步地尝试了可怕吗? 如果您的项目/解决方案很简单,那么您可以尝试对其进行分段,假设您使用模块化构建并单独测试每个组件。 没有任何代码或可见的析构函数,我可以给你抽象的建议,我很害怕。 但是,我希望尝试最小化调试字段将在某种程度上有所帮助。
祝你好运:)
即时程序退出(是的,这是一个可怕的解决方案)是abort()
这很可能是因为正在访问NULL指针。 根据您的操作系统尝试获取堆栈跟踪并确定罪魁祸首,不要只是退出。
如果你使用linux,valgrind应该解决你的问题。 但如果是windows,请尝试以下方法之一:MemoryValidator,BoundsChecker或其他类似的工具。
简单地关闭你的应用程序并不是处理bug的最佳方法......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.