如何在C ++中终止程序

时间:2010-09-02 19:31:55

标签: c++ memory-management

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

8 个答案:

答案 0 :(得分:7)

你应该解决问题。

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

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

abort()

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

  • 出口()

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

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

答案 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的最佳方法......

相关问题