在C语言中,任何不为0的值都是真的。因此,你肯定可以使用:
if (ptrToObject)
ptrToObject->doSomething();
安全取消引用指针。
C++11有些变化,nullptr_t
是一种类型,nullptr
是它的一个实例;nullptr_t
的表示是特定于实现的。因此,编译器可以按其所需定义nullptr_t
。它只需要确保可以强制执行对不同类型的nullptr_t
转换的适当限制--其中允许布尔值--并确保可以区分nullptr_t
和0。
因此,只要编译器遵循C++11语言规范,nullptr
将被正确且隐式地转换为布尔值false
,上面的代码片段仍然有效。
如果删除引用对象,则不会发生任何更改。
delete ptrToObject;
assert(ptrToObject);
ptrToObject = nullptr;
assert(!ptrToObject);
因为我已经写了这么长时间的if语句,所以在使用指针之前检查其是否有效已经成为我的本能反应。我会打出 if (object *) 并调用其成员。
不行。 请维护一个适当的对象图(最好使用唯一/智能指针)。正如指出的那样,无法确定指向非
nullptr
的指针是否指向有效的对象。责任始终在于您来维护生命周期...这就是指针包装器首先存在的原因。
事实上,由于
shared 和
weak 指针的生命周期是明确定义的,它们具有语法糖,可以让您像使用裸指针一样使用它们,其中有效指针具有值,而所有其他指针都为
nullptr
:
共享指针
#include <iostream>
#include <memory>
void report(std::shared_ptr<int> ptr)
{
if (ptr) {
std::cout << "*ptr=" << *ptr << "\n";
} else {
std::cout << "ptr is not a valid pointer.\n";
}
}
int main()
{
std::shared_ptr<int> ptr;
report(ptr);
ptr = std::make_shared<int>(7);
report(ptr);
}
弱
#include <iostream>
#include <memory>
void observe(std::weak_ptr<int> weak)
{
if (auto observe = weak.lock()) {
std::cout << "\tobserve() able to lock weak_ptr<>, value=" << *observe << "\n";
} else {
std::cout << "\tobserve() unable to lock weak_ptr<>\n";
}
}
int main()
{
std::weak_ptr<int> weak;
std::cout << "weak_ptr<> not yet initialized\n";
observe(weak);
{
auto shared = std::make_shared<int>(42);
weak = shared;
std::cout << "weak_ptr<> initialized with shared_ptr.\n";
observe(weak);
}
std::cout << "shared_ptr<> has been destructed due to scope exit.\n";
observe(weak);
}
现在,C ++会对指针执行相同的操作吗?如果像这样将char *传递给if语句呢?
因此,回答问题:对于裸指针来说,否。对于包装指针,是的。
封装您的指针,朋友们。
delete
时不需要检查指针。删除nullptr
是完全安全的。 - n. m.char * meh = nullptr; if(meh)
?这个指针没有初始化。 - Jesse Goodnew
表达式的结果永远不会为空,而是会使用异常。同时,删除空指针是可以的,它不会产生任何作用。此外,通常最好不要将指针的值重置为 null。最后一次使用它应该是它不为 null 的最后一次,因此访问已经被删除的指针应被视为一个 bug;将其设置为 null 就隐藏了这个问题。 - GManNickG