C++11新特性(40)- 智能指针shared_ptr(2)

本文说明shared_ptr的初始化。


shared_prt的本身是一个类,所以它的初始化实际上就是调用shared_ptr类的构造函数。通过分析shared_ptr的构造函数,就可以准确把握shared_ptr初始化的方法。


default构造函数


函数原型:

constexpr shared_ptr() noexcept;


说明:

声明空shared_ptr


代码示例:

C++11新特性(40)- 智能指针shared_ptr(2)

空指针构造


函数原型:

constexpr shared_ptr(nullptr_t);


说明:

通过空指针构造shared_ptr,动作default构造函数动作相同。


代码实例

C++11新特性(40)- 智能指针shared_ptr(2)

由指针构造


函数原型:

explicit shared_ptr (U* p);


说明:

根据已有指针构造shared_ptr。


代码实例:

C++11新特性(40)- 智能指针shared_ptr(2)

注意事项

实例中展示的两种方式都合法,但是在第二种情况中应该理解,一旦构造了share_ptr,就表明s指向的string对象的内存管理已经交给ps1管理而不应该在通过s访问了(至少是非常小心的访问)。

第二种方式应该尽量避免。


拷贝构造


函数原型:

shared_ptr (const shared_ptr& x) noexcept;


说明:

由一个已有的shared_ptr创建新的share_ptr。其间会自动维护应用计数。


代码示例:

C++11新特性(40)- 智能指针shared_ptr(2)

程序输出:

C++11新特性(40)- 智能指针shared_ptr(2)

拷贝构造函数执行以后,引用计数增加,两个指针指向同一个对象。


移动构造


函数原型:

shared_ptr (shared_ptr&& x) noexcept;


说明:

由一个已有的shared_ptr创建新的share_ptr。作为参数的shared_pt同时会释放对内存的管理权利,整个构造过程结束后,引用计数不变。


代码示例:


C++11新特性(40)- 智能指针shared_ptr(2)


程序输出:


C++11新特性(40)- 智能指针shared_ptr(2)

内存管理由ps转移到了ps1。


修饰符说明


explicit:保证该构造函数不会被隐式调用

noexcept:该函数不会抛出异常,

constexpr:该函数可以在编译期间求值(可以参考前面的文章)。


作者观点


寻根溯源有时会难一些,但是一定会发现最全面,最鲜活的信息!



觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

C++11新特性(40)- 智能指针shared_ptr(2)