【发布时间】:2012-07-01 05:00:33
【问题描述】:
在我从未听说过智能指针的几个旧代码项目中,每当我需要检查指针是否仍然指向有效对象时,我总是会做这样的事情......
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 有多久了,此时通过键入 if (object *) 然后调用其成员来检查指针是否有效在这一点上是第二天性。如果这不是功能,为什么不呢?实施起来太难?将通过删除另一种可能会弄乱代码的小方法来解决一些问题。
【问题讨论】:
-
您确实不需要在
deleteing 之前检查指针。delete和nullptr是完全安全的。 -
在你上一个例子中,你的意思是
char * meh = nullptr; if(meh)吗?指针未初始化。 -
new表达式的结果永远不会为空,而是使用异常。如前所述,删除 null 很好,它什么都不做。此外,通常最好不要将指针值重置为 null。最后一次使用它应该是最后一次不为空,因此访问已删除指针应该被认为是一个错误;将其设置为 null 会隐藏它。 -
“我总是在指针失效后将它设置为零,所以我知道一个非零的指针是有效的”是一个anti-pattern。如果你有两个指向同一个对象的指针会发生什么?将一个设置为零不会影响另一个。
-
@FatalCathasis:会的。但是,如果其他一些代码删除指针的其他一些副本然后取消引用它,则会发生相同的运行时错误。因此,将指针归零既不是必要的,也不是充分的。如果你在不需要的地方使用它,你只是效率低下。但是,如果您在不够用的地方使用它……繁荣。 (当然,这并不意味着你永远不应该这样做。但它很少是适合这项工作的工具,并且在许多严重错误的地方使用。这就是使它成为反模式的原因。)
标签: c++