我从某个博客中读到,默认构造的(空)shared_ptr
会自动初始化为nullptr
。但在统计局中找不到任何这样的明确声明。
我写了一小段(Linux Compiled)来确认这一点:
#include <iostream>
#include <memory>
struct Base;
int main()
{
std::shared_ptr<Base> p;
Base* b;
if (p == nullptr) {
std::cout << "p IS NULL n";
}
else {
std::cout << "p NOT NULL n";
}
if (b == nullptr) {
std::cout << "b IS NULL n";
}
else {
std::cout << "b NOT NULL n";
}
return 0;
}
输出:
p IS NULL b NOT NULL
由此我看到智能指针在声明时隐式分配nullptr
。有人可以确认这种行为吗?在不手动为其分配nullptr
的情况下使用shared_ptr
是否安全?
是的,cpp首选项告诉我们默认构造函数与仅将nullptr
传递给构造函数相同:
constexpr shared_ptr() noexcept; (1)
constexpr shared_ptr( std::nullptr_t ) noexcept; (2)
1-2) 构造一个没有托管对象的shared_ptr,即空shared_ptr
同样来自2017年C++标准草案:
23.11.2.2.1
shared_ptr
构造函数。
constexpr shared_ptr() noexcept;
2效果:构造一个空的shared_ptr
对象。
3后置条件:use_count() == 0 && get() == nullptr
.
这在 [util.smartptr.shared.const]/3 中有介绍
。确保:
use_count() == 0 && get() == nullptr
.