默认构造的(空)shared_ptr会自动初始化为 nullptr 吗?
Will a default-constructed (empty) shared_ptr automatically be initialized to nullptr?
我从某个博客中读到,默认构造的(空)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
.
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- boost::spirit指针属性是用nullptr初始化的吗?
- 为什么 char 可以在 std::array 中初始化为 nullptr,而不是单独初始化?
- 使用默认值初始化unique_ptr向量(nullptr?
- 如何使用nullptr初始化同一类对象的静态指针数组?
- 为什么我不能使用 nullptr 初始化自动推导的指针?
- 指向自定义类型的静态指针在初始化后使用相同类型的静态非空指针保持 nullptr
- 由nullptr初始化的C++11自动变量
- C++11:如何使用 nullptr 初始化某个类的指针数组
- 零初始化的 std::atomic<T*> 保证等同于 nullptr 初始化的 std::T* 保证?