【问题标题】:Will a default-constructed (empty) shared_ptr automatically be initialized to nullptr?默认构造的(空)shared_ptr 会自动初始化为 nullptr 吗?
【发布时间】:2023-03-16 18:15:01
【问题描述】:

我从一些博客中读到默认构造(空)shared_ptr 会自动初始化为nullptr。但是在标准中找不到任何这样的明确声明。

我写了一个小sn-p(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 是否安全?

【问题讨论】:

标签: c++ c++11 smart-pointers


【解决方案1】:

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

constexpr shared_ptr() noexcept;                        (1)
constexpr shared_ptr( std::nullptr_t ) noexcept;        (2)

1-2) 构造一个没有托管对象的shared_ptr,即空shared_ptr

同样来自C++ standard draft for 2017

23.11.2.2.1 shared_ptr 构造函数

...

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

【讨论】:

    【解决方案2】:

    [util.smartptr.shared.const]/3 对此进行了介绍

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

    【讨论】:

    • @MaxLanghof 我有那些疯狂的忍者技能 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2019-09-16
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多