在Linux上尝试/捕获分段错误

时间:2009-02-05 09:27:07

标签: c++ linux pointers segmentation-fault

我有一个Linux C ++应用程序,我想在解除引用之前测试对象指针的有效性。但是,由于分段错误,try / catch在Linux上不起作用。怎么办呢?

9 个答案:

答案 0 :(得分:8)

分段错误不是异常(如Java的NullPointerException);它是从OS发送到进程的信号。请查看the manpage for sigaction以获取有关如何为分段错误(SIGSEGV)安装处理程序的指示。

答案 1 :(得分:8)

如果您的应用程序中有许多指针引用了相同的有限生命周期对象,那么流行的解决方案是使用boost smart pointers编辑:在C ++ 11中,标准库中都提供了这两种类型

您可能希望shared_ptr用于指示对象生命周期的指针,weak_ptr用于其他可能无效的指针。您会看到weak_ptr具有您要求内置的有效性检查。

答案 2 :(得分:4)

将指针初始化为NULL。如果经过一些处理后它仍为NULL,则无效,否则无效。

答案 3 :(得分:4)

您可以为此次事件启用SIGSEGV的信号处理程序。有关详细信息,请参见手册页“信号”。另一种方法是使用保证有效的引用。这取决于你当然的应用。

答案 4 :(得分:2)

原始C ++指针没有自然,通用的方法。 C ++假定您将跟踪该信息。

在大多数情况下,您可以通过记住在无效时将指针设置为NULL来处理此问题。最初不指向的新指针应设置为NULL,新删除的对象应将其指针设置为NULL。

答案 5 :(得分:1)

如何测试指针的有效性?比较NULL?

您要做的最好的事情是在Valgrind下运行您的程序。一个错误可能在一个完全不同的地方。

更新:在Win32平台上有类似__try __except的东西,可以捕获一些异常。据我所知,Win32功能没有Linux等价物。

答案 6 :(得分:0)

如果您将处理程序附加到SIGSEGV,除了记录错误发生的事实并且正常失败之外,您无能为力。发生此违规时,您的程序处于未定义状态,因此继续正常操作可能不安全。

除了检查NULL之外,我不相信有一种方法可以检查指针在您描述的意义上是否“有效”。在正常操作期间,这样的错误不应该发生,因为它们代表了一个错误,所以你应该希望你的程序失败,尽管是优雅的。

答案 7 :(得分:0)

指针存储在对象中。它们在构造函数中初始化,可能为0(NULL)。它们在析构函数中被删除,可能在赋值中被删除,很少在其他函数中删除。当在析构函数以外的成员中删除时,会立即为它们分配一个新值或0。

答案 8 :(得分:0)

一般来说,关于“检查非NULL指针的有效性”这个非常奇怪的想法,请看一下这篇文章:http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx(“IsBadXxxPtr应该真的叫做CrashProgramRandomly”)

相关问题