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)
输出:
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; }
由此我看到智能指针是nullptr在声明时隐式分配的。有人可以确认这种行为吗?使用 ashared_ptr而不手动nullptr为其分配 a是否安全?
是的,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
23.11.2.2.1
shared_ptr构造函数...
constexpr shared_ptr() noexcept;
2效果:构造一个空shared_ptr对象。
3后置条件:use_count() == 0 && get() == nullptr.