2011-10-05 86 views
8

我有一个代码,我使用指针访问某些数据块。在一些罕见的情况下,数据块的一些成员是空的,结果指​​针变得悬空。实际上,我得到了正确的指针,但是当试图用指针做某事时,程序崩溃了。有什么办法检查指针是否悬空?

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

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

这是正确的方法吗?

回答

5

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

+0

我的指针应该是静态的类..它仍然很好如果我使用智能指针? – Nikhil

+0

这完全没有问题。您需要注意线程安全问题,但这对于智能指针与原始指针来说没有什么不同。 –

+2

我不认为这很重要。唯一令我困扰的是,你的框架本身是否可以让你的指针在没有任何预先通知的情况下悬摆。请参阅,您必须从智能指针中提取原始指针并将其传递到您的框架。如果它保证指针在调用后仍然有效,或者如果它会变得无效就会被通知 - 很好,请继续。 – Septagram

7

我认为你正在看错方向。你可能有一个错误,你无法正确初始化指针,太早删除对象,并试图在指针被删除或重复之后重用它。如果是这样的话,你应该专注于确定发生的原因并修复bug,而不是试图找到隐藏bug的方法。

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

使用已经提出的智能指针可能取决于库实际做了什么以及是否可以随时传递智能指针。一般来说,使用智能指针进行内存管理是一个不错的主意,而这又会保证指针将被正确初始化(如果问题是初始化,则修复),并且由于您不再手动操作,因此如果问题出现与早期删除不会再发生。但请注意,尽管这可能会解决问题,但我仍然认为您需要了解指针在应用程序中无效的原因,因为这可能是更大问题的征兆。现在

,对如何检查指针是否悬空或不是原来的问题,你不能做到这一点的程序,但你可以运行内部内存调试(你的程序的valgrind在Linux中,净化或一组人的在Linux中),并且该工具将能够帮助您确定指针是否从未初始化,或者如果在错误使用之前将内存释放到系统中。

+0

感谢您的详细解释。我可以理解,我应该找到一个解决方案,而不是隐藏bug ...但是在设计的框架中有一个漏洞,我不能在短时间内改变。所以我正在寻找解决方法。我也尝试过智能指针,但它没有成功。 – Nikhil

1

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

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

相关问题