我有一个 Linux C++ 应用程序,我想在取消引用之前测试一个对象指针的有效性。但是由于分段错误,try/catch 在 Linux 上对此不起作用。如何才能做到这一点?
9 回答
分段错误不是异常(如 Java 的 NullPointerException);它是从操作系统发送到进程的信号。查看sigaction 的联机帮助页,了解如何为分段错误 (SIGSEGV) 安装处理程序。
如果您的应用程序中的许多指针引用相同的有限生命周期对象的情况,一种流行的解决方案是使用boost 智能指针。 编辑:在 C++11 中,这两种类型都在标准库中可用
您可能希望使用shared_ptr
负责对象生命周期的weak_ptr
指针和其他可能变得无效的指针。您会看到它weak_ptr
具有您要求的内置有效性检查。
您可以为此事件启用 SIGSEGV 的信号处理程序。有关详细信息,请参见手册页“信号”。另一种选择是使用保证有效的引用。当然,这取决于您的应用程序。
将指针初始化为 NULL。如果经过一些处理它仍然是 NULL 它是无效的,否则它是有效的。
原始 C++ 指针没有自然、通用的方法。C++ 假定您将跟踪该信息。
在大多数情况下,您可以通过记住在指针无效时将指针设置为 NULL 来处理此问题。最初不指向的新指针应设置为 NULL,新删除的对象应将其指针设置为 NULL。
你如何测试指针的有效性?与NULL比较?
你做的最好的事情是在Valgrind下运行你的程序。一个错误可能在一个完全不同的地方。
更新:在 Win32 平台上有类似 __try __except 的东西,它允许捕获一些异常。据我所知,该 Win32 功能没有 Linux 等价物。
如果您将处理程序附加到 SIGSEGV,除了记录错误发生并正常失败的事实之外,您无能为力。发生这种违规时,您的程序处于未定义状态,因此继续正常操作可能不安全。
除了检查 NULL 我不相信有一种方法可以检查指针在您所描述的意义上是否“有效”。在正常操作期间,不应发生此类错误,因为它们代表错误,因此您应该希望程序失败,尽管是优雅的。
指针存储在对象中。它们在构造函数中初始化,可能为 0 (NULL)。它们在析构函数中被删除,可能是在赋值中,很少在其他函数中。当在除析构函数之外的成员中删除时,它们会立即被分配一个新值或 0。
一般来说,关于“检查非 NULL 指针的有效性”这个非常奇怪的想法,看看这篇文章:http: //blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx( “IsBadXxxPtr 真的应该被称为 CrashProgramRandomly”)