Nik*_*hil 11 c++ mfc pointers 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;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
无法检查原始指针是否有效.无效指针在访问时无法保证失败.您需要使用某种形式的智能指针,而不是使用原始指针.
我认为你正在寻找错误的方向.您可能有一个错误,您没有正确初始化指针,过早删除对象并尝试在删除指针或类似之后重用指针.如果是这种情况,您应该专注于确定发生的原因并修复错误,而不是试图找到隐藏错误的方法.
对于您与typeid操作员一起使用的方法,答案是它无效.对于不包含虚函数的类型的对象,将typeid在编译时根据指针的静态类型解析运算符.对于包含至少一个虚函数的对象,它在运行时被解析,但typeid(p)使用无效指针调用是未定义的行为,并且以它似乎工作的相同方式可能会崩溃.
使用已建议的智能指针可能取决于库实际执行的操作以及是否可以随时传递智能指针.一般来说,使用智能指针进行内存管理是一个好主意,这反过来会保证指针将被正确初始化(如果问题是初始化则修复)并且因为你不再delete手动操作,如果问题是早期删除将不再发生.但请注意,虽然这可能会解决问题,但我仍然认为您需要了解指针在应用程序中无效的原因,因为这可能是更大问题的症状.
现在,关于如何检查指针是否悬空的原始问题,你不能在程序中执行它,但你可以在内存调试器(linux中的valgrind,purify或linux中的其他一组)中运行你的程序,该工具将能够帮助您确定指针是否从未初始化,或者您是否在错误使用之前将内存释放到系统.
| 归档时间: |
|
| 查看次数: |
6315 次 |
| 最近记录: |