C++学习 一、shared_ptr使用
前言
- 前言
- shared_ptr概述
- 创建shared_ptr对象
- 0 声明shared_ptr对象
- 1 通过堆指针创建shared_ptr对象
- 2 通过拷贝构造函数创建shared_ptr对象
- 3 通过赋值运算符修改shared_ptr
- 4 通过std::make_ptr函数初始化
- 几个shared_ptr对象初始化问题
- shared_ptr类禁止构造函数的隐式转换
- 不能用栈指针进行初始化
- 不能将同一普通指针给多个shared_ptr对象初始化
- 循环引用问题
- shared_ptr与操作符
- shared_ptr的成员函数
- shared_ptr数组
- 测试用代码
- 后记
本篇开启C++专题。本来应该从最基础的数据类型开始,但为了服务于看代码,写到哪算哪。
C++11提供了智能指针类,包括unique_ptr,shared_ptr,weak_ptr三种,用以自动释放内存、减少内存泄漏和保障线程安全。首先从shared_ptr开始。
shared_ptr概述shared_ptr即共享指针,因此多个shared_ptr对象可以与同一个指针相关联。
shared_ptr内部具有两个指针:
- 指向对象
- 指向控制引用计数的资源
第一个指针与普通指针无异,第二个指针用于计数自身被引用次数。
shared_ptr的构造函数会开辟出新的一片引用计数的资源,引用计数=1;拷贝构造函数不会开辟新的资源,而是使引用计数+1;当shared_ptr对象被销毁时,其相关的引用计数-1;当引用计数为0时,通过delete释放指针指向的内存,销毁指针。
创建shared_ptr对象 0 声明shared_ptr对象std::shared_ptr p1;
1 通过堆指针创建shared_ptr对象
std::shared_ptr p2(new double(2.));
2 通过拷贝构造函数创建shared_ptr对象
std::shared_ptr p3(p2);
// 等价于
std::shared_ptr p3 = p2;
3 通过赋值运算符修改shared_ptr
p1 = p3;
4 通过std::make_ptr函数初始化
std::shared_ptr p4 = std::make_shared(3.0);
// 也可以初始化一个空对象
std::shared_ptr p4 = std::make_shared();
几个shared_ptr对象初始化问题
shared_ptr类禁止构造函数的隐式转换
//std::shared_ptr p3 = new double(3.0); error! forbid implicit conversions
这是因为销毁内部指针时,使用的是delete函数。
不能用栈指针进行初始化//double x = 5.0;
//std::shared_ptr p5(&x);
// error! invalid pointer
不能将同一普通指针给多个shared_ptr对象初始化
//std::shared_ptr p3(p2.get());
//std::shared_ptr p4(p2.get());
上面的初始化通过p2内的对象指针初始化p3和p4,当p3,p4的生命周期结束时,将会包delete double的错误。
原因是:两次初始化得到的p3,p4的引用计数都是1,首先销毁p4,其引用计数变为0,释放p2.get()指针指向的内存;然后销毁p3,其引用也变为0,再次释放内存。
循环引用问题shared_ptr还有一个容易出现的循环引用问题,代码如下:
class A;
class B;
class A
{
public:
std::shared_ptr b_;
public:
A(){
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?