默认构造的(空)shared_ptr会自动初始化为 nullptr 吗?

Will a default-constructed (empty) shared_ptr automatically be initialized to nullptr?

本文关键字:初始化 nullptr ptr shared 默认      更新时间:2023-10-16

我从某个博客中读到,默认构造的(空)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.1shared_ptr构造函数


  constexpr shared_ptr() noexcept;2效果:构造一个空的shared_ptr对象。
  3后置条件:use_count() == 0 && get() == nullptr.

这在 [util.smartptr.shared.const]/3 中有介绍

确保:use_­count() == 0 && get() == nullptr.