有没有办法检查指针是否悬空

Is there any way to check if pointer is dangling?

本文关键字:是否 指针 检查 有没有      更新时间:2023-10-16

我有一个代码,我使用指针访问一些数据锁。在一些罕见的情况下,数据锁的一些成员是空的,因此指针变成悬空。事实上,我得到了正确的指针,但当试图用指针做某事时,程序崩溃了。

通常的建议是避免这种用法。但遗憾的是,我使用的框架要求我使用这种类型的数据访问方法。

是否有一种方法,我可以"检查",如果指针是无效的做任何操作之前?检查指针不等于NULL显然不起作用。我还试了这个:

try
{
    CString csClassName = typeid(*pMyPointer).name();  // Check error condition
    // The line below fails due to dangling pointer (data block is not valid).
    hr = pMyPointer->MyPointerMethod(); 
}
catch(bad_typeid)
{
    return E_FAIL;
}
catch(...)
{
    return E_FAIL;
}

是正确的方式吗?

没有办法检查原始指针是否有效。无效指针不能保证在访问时失败。与使用原始指针不同,您需要使用某种形式的智能指针。

我想你看错方向了。你可能有一个错误,你没有正确地初始化指针,过早地删除对象,并试图在指针被删除后重用或类似的东西。如果是这种情况,您应该集中精力确定为什么会发生这种情况并修复错误,而不是试图找到隐藏错误的方法。

对于您正在使用的typeid操作符的方法,答案是它无效。对于不包含虚函数类型的对象,在编译时根据指针的静态类型解析typeid操作符。对于包含至少一个虚函数的对象,它在运行时被解决,但是用无效指针调用typeid(p)是未定义的行为,并且以同样的方式它似乎可以工作,它可能会崩溃。

所建议的智能指针的使用可能取决于标准库实际做什么,以及您是否可以随时传递智能指针。一般来说,使用智能指针进行内存管理是一个好主意,这将反过来保证指针将被正确初始化(如果问题是初始化则修复),并且因为您不再手动delete,所以如果问题是早期删除,则可能不再发生。但是请注意,虽然这可能解决问题,但我仍然认为您需要了解为什么指针在应用程序中无效,因为这可能是更大问题的征兆。

现在,关于如何检查指针是否悬空的原始问题,您不能在程序中这样做,但是您可以在内存调试器(linux中的valgrind, Purify或linux中的其他一组)中运行您的程序,并且该工具将能够帮助您确定指针是否从未初始化,或者您是否在错误使用之前将内存释放给系统。

可以使用智能指针

你不需要智能指针。它们只是处理这个问题的一种可能的方法。

可以使用相互引用:在被引用的对象(referencee)中,返回到引用它的对象(referencers)的引用列表。当需要释放referencee时,首先遍历它的引用者列表,并设置它们用来指向referencee的任何属性为null(通常您希望事先知道这是哪个属性),然后释放referencee。