繁体   English   中英

如何在C ++中终止程序

[英]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次分析我的代码(错误必须在某处),感谢您的所有提示:)

你应该解决这个问题。

  • 第一步:检查你用atexit()注册的所有功能(我希望不多)
  • 第二步:找到所有全局变量并检查它们的析构函数。
  • 第三步:找到所有静态函数变量检查它们的析构函数。

但否则你可以中止。
注意:abort用于Abnormal程序终止。

abort()

区别:(注意让应用程序离开main函数相当于exit())

  • 出口()

    1. 使用atexit(3)函数注册的函数按其注册的相反顺序调用。 这包括销毁所有全局(静态存储持续时间)变量。
    2. 刷新所有打开的输出流。
    3. 关闭所有打开的流。
    4. 取消链接使用tmpfile(3)函数创建的所有文件。
  • 中止()

    1. 刷新所有打开的输出流。
    2. 关闭所有打开的流。

由于不止一个原因,这是一个可怕的解决方案。 它会隐藏问题(可能),但它也可能会破坏数据,具体取决于应用程序的性质。

为什么不使用调试器并尝试找出导致错误的原因?

如果您的应用程序是多线程的,则应确保在退出应用程序之前正确关闭所有线程。 当后台线程尝试使用已经被破坏的内存/对象时,这是退出时出现此类错误的一个相当常见的原因。

编辑:

根据您更新的问题,我有以下建议:

尝试更具体地找出导致析构函数崩溃的原因。

我要做的第一件事就是确保它不会尝试破坏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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM