有没有办法检查指针是否悬空
Is there any way to check if pointer is dangling?
我有一个代码,我使用指针访问一些数据锁。在一些罕见的情况下,数据锁的一些成员是空的,因此指针变成悬空。事实上,我得到了正确的指针,但当试图用指针做某事时,程序崩溃了。
通常的建议是避免这种用法。但遗憾的是,我使用的框架要求我使用这种类型的数据访问方法。
是否有一种方法,我可以"检查",如果指针是无效的做任何操作之前?检查指针不等于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。
- std::vector::迭代器是否可以合法地作为指针
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 返回指向对象的指针的函数调用是否为 prvalue?
- 对象初始化中是否允许指向此成员的指针?
- 新分配指向函数的指针是否合法?
- 在函数结束后使用指向变量的指针是否安全?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 是否可以使用函数指针调用虚拟析构函数?
- std::less是否应该允许在编译时比较不相关的指针?
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 检查输入 std::array 指针数据是否等于某个常量数组
- 成员访问是否在空指针上定义C++?
- 如果只有 std::auto_ptr 可用,我是否仍应该使用智能指针?
- 是否可以使用指针访问变量以避免直接编辑变量?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- "this"指针的值在对象的生存期内是否恒定?