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

时间:2011-10-05 09:24:17

标签: c++ pointers mfc dangling-pointer

我有一个代码,我用一个指针访问一些数据块。在极少数情况下,数据块的一些成员是空的,因此指针变为悬空。实际上,我得到了正确的指针,但程序在尝试用指针做某事时崩溃了。

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

在使用它进行任何操作之前,有没有办法可以“检查”指针是否无效?显然,检查指针不等于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;
}

这是正确的方法吗?

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

我认为你正在寻找错误的方向。您可能有一个错误,您没有正确初始化指针,过早删除对象并尝试在删除指针或类似之后重用指针。如果是这种情况,您应该专注于确定发生的原因并修复错误,而不是试图找到隐藏错误的方法。

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

使用已建议的智能指针可能取决于库实际执行的操作以及是否可以随时传递智能指针。一般来说,最好使用智能指针进行内存管理,这样可以保证指针正确初始化(如果问题是初始化则修复),并且因为你不再手动delete,机会很大如果问题是早期删除将不再发生。但请注意,虽然这可能会解决问题,但我仍然认为您需要了解指针在应用程序中无效的原因,因为这可能是更大问题的症状。

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

答案 2 :(得分:3)

是的,您可以使用smart pointers

答案 3 :(得分:2)

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

您可以使用互惠引用:在引用的对象(引用)中,返回引用它的引用列表(引用者)。当需要释放引用者时,首先浏览其引用者列表并将其用于指向引用者的任何属性设置为null(通常您希望事先知道这将属于哪个属性),然后解除分配引用者。