在我从未听说过智能指针的几个旧代码项目中,每当我需要检查指针是否仍然指向有效对象时,我总会做这样的事情......
object * meh = new object;
if(meh)
meh->member;
或者当我需要安全删除对象时,就像这样
if(meh)
{
delete meh;
meh = 0;
}
好吧,现在我已经了解了使用文字数字在布尔表达式中使用对象和指针可能产生的问题,这很难:。现在我还了解了C ++这个nullptr
关键字的新功能还不是很酷的功能。但现在我很好奇。
我已经完成并修改了大部分代码,例如,在删除我现在写的对象时
if(meh)
{
delete meh;
meh = nullptr;
}
现在我想知道布尔值。当你把一个int传递给像这样的if语句时,
int meh;
if(meh)
然后它隐式检查零而不需要你编写它。
if(meh == 0) // does the exact same check
现在,C ++会为指针做同样的事情吗?如果将这样的char *传递给if语句?
char * meh;
if(meh)
然后它会隐式地将它与nullptr进行比较吗?由于我已经写了这样多长时间,所以在这一点上通过输入if(object *)然后调用其成员来检查指针在使用之前是否有效是第二天性。如果这不是功能,为什么不呢?实施起来太难了?通过删除另一种可能会破坏代码的微小方法来解决一些问题。
答案 0 :(得分:39)
在C中,任何不为0的东西都是真的。所以,你当然可以使用:
if (ptrToObject)
ptrToObject->doSomething();
安全地取消引用指针。
C ++ 11稍微改变了游戏,nullptr_t
是nullptr
是一个实例的类型; nullptr_t
的表示是特定于实现的。所以编译器可以定义nullptr_t
但是它想要。它只需要确保它可以强制适当限制将nullptr_t
转换为不同类型 - 其中允许布尔 - 并确保它可以区分{{1 }和0。
只要编译器遵循C ++ 11语言规范,那么nullptr_t
将被正确且隐式地转换为 boolean nullptr
。上面的片段仍然可以使用。
如果删除引用的对象,则不会发生任何变化。
false
由于我这样写这些if if有多长时间,所以在这一点上通过输入if(object *)然后调用它的成员来检查指针在使用之前是否有效是第二天性。
否。 请保持正确的对象图表(最好使用唯一/智能指针)。正如所指出的,无法确定非delete ptrToObject;
assert(ptrToObject);
ptrToObject = nullptr;
assert(!ptrToObject);
的指针是否指向有效对象。无论如何,你有责任维护生命周期..这就是为什么指针包装器首先存在的原因。
答案 1 :(得分:10)
无法测试指针是否指向有效对象。如果指针不为null但未指向有效对象,则使用指针会导致未定义的行为。为了避免这种错误,你要注意要注意指向的对象的生命周期;智能指针类可以帮助完成这项任务。
如果meh
是原始指针,则if (meh)
与if (meh != 0)
和if (meh != nullptr)
之间没有任何区别。如果指针不为空,它们都会继续。
从文字0
到nullptr
的隐式转换。