【发布时间】:2010-10-05 15:14:28
【问题描述】:
我有一个 Linux C++ 应用程序,我想在取消引用之前测试一个对象指针的有效性。但是由于分段错误,try/catch 在 Linux 上对此不起作用。如何做到这一点?
【问题讨论】:
标签: c++ linux pointers segmentation-fault
我有一个 Linux C++ 应用程序,我想在取消引用之前测试一个对象指针的有效性。但是由于分段错误,try/catch 在 Linux 上对此不起作用。如何做到这一点?
【问题讨论】:
标签: c++ linux pointers segmentation-fault
如果您的应用程序中的许多指针引用相同的有限生命周期对象,则一种流行的解决方案是使用boost smart pointers。 编辑:在 C++11 中,这两种类型都在标准库中可用
您可能希望将shared_ptr 用于负责对象生命周期的指针,而将weak_ptr 用于其他可能无效的指针。您会看到 weak_ptr 具有您要求的内置有效性检查。
【讨论】:
分段错误不是异常(如 Java 的 NullPointerException);它是从操作系统发送到进程的信号。查看the manpage for sigaction 以获取有关如何为分段错误 (SIGSEGV) 安装处理程序的指示。
【讨论】:
您可以针对这一情况启用 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”)
【讨论】: