在 C 中,任何不为 0 的都是真的。所以,你当然可以使用:
if (ptrToObject)
ptrToObject->doSomething();
安全地取消引用指针。
C++11 稍微改变了游戏,nullptr_t
它的类型nullptr
是实例;的表示nullptr_t
是特定于实现的。因此,编译器可以随心所欲地定义nullptr_t
。它只需要确保它可以对 anullptr_t
到不同类型的强制转换实施适当的限制——允许使用布尔值——并确保它可以区分 anullptr_t
和 0。
只要编译器遵循 C++11 语言规范,Sonullptr
就会正确且隐式地转换为布尔值。 false
上面的代码片段仍然有效。
如果删除引用的对象,则不会发生任何变化。
delete ptrToObject;
assert(ptrToObject);
ptrToObject = nullptr;
assert(!ptrToObject);
由于我已经像这样编写这些 if 有多久了,此时通过键入 if (object *) 然后调用它的成员来检查指针是否在使用之前有效是第二天性。
不,请保持正确的对象图(最好使用唯一/智能指针)。正如所指出的,没有办法确定一个不是nullptr
指向有效对象的指针。无论如何,您有责任维护生命周期。这就是指针包装器首先存在的原因。
事实上,由于共享指针和弱指针的生命周期定义明确,它们具有语法糖,可让您以您希望使用裸指针的方式使用它们,其中有效指针具有值,而所有其他指针是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 语句?
所以回答这个问题:用裸指针,没有. 使用包装的指针,是的。
伙计们,把你的指针包起来。