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

Boa*_*ges 4 c++ smart-pointers c++11

我从一些博客中读到默认构造的(空)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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

#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;
}
Run Code Online (Sandbox Code Playgroud)

由此我看到智能指针是nullptr在声明时隐式分配的。有人可以确认这种行为吗?使用 ashared_ptr而不手动nullptr为其分配 a是否安全?

ruo*_*ola 7

是的,cppreference告诉我们默认构造函数与仅将 a 传递nullptr给构造函数相同:

constexpr shared_ptr() noexcept;                        (1)
constexpr shared_ptr( std::nullptr_t ) noexcept;        (2)
Run Code Online (Sandbox Code Playgroud)

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 .


Nat*_*ica 5

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

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