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