关于智能指针的理解

c++智能指针,即句柄类,用于管理动态内存,自动去回收空间,因为在使用new时,难免会出现以下几种状况:
1.忘记delete内存,这种情况就是我们常说的“内存泄漏”。
2.使用已经释放的对象,这要求我们要清楚变量的内存情况。
3.同一会内存释放两次。

智能指针有四种,均包含在头文件中,auto_ptr已被c++11抛弃,下面只讨论shared_ptr,unique_ptr和weak_ptr。

1.shared_ptr

(1)定义一个shared_ptr,并初始化
智能指针是模板类,因此需要指定其管理的对象类型,如下。

shared_ptr<int> p1;
shared_ptr<vector<int>>p2;

shared_ptr<int> p3(new int(10));

通过new为shared_ptr分配相应类型的动态内存。
智能指针使用方式与普通指针类似,*p1解引用智能指针则会返回其所指向的对象。
注意:由于不能进行内置指针到智能指针的隐式转换所以不能这样写

shared_ptr<int> p3 = new int(10);//错误
shared_ptr<int> clone(int p)
{
	return new int(p);//错误
}

(2)shared_ptr支持的操作
在这里插入图片描述
在这里插入图片描述
注意:不要使用get来初始化另一智能指针或给其赋值,因为get返回的是该智能指针指向的对象指针,所以即使使用它来初始化智能指针,其引用计数不会递增。所以当那块区域被释放了,就会造成悬空指针了。

(3)关于make_shared
对于shared_ptr,这是最安全的分配,它会返回指向指定类型对象的shared_ptr,注意等好两边类型需相对应。

share_ptr<int> p = make_shared<int>(11);//指向一个值为11的int的share_ptr
share_ptr<vector<int>> p1 = make_shared<vector<int>>(5,1);//指向一个五个元素均为1的vector的shared_ptr

(4)shared_ptr的拷贝和赋值
智能指针的特点就是其关联一个计数器类(引用计数器),当我们拷贝一个shard_ptr,即每当多一个shared_ptr指向这块动态内存,计数器都会加一,同样的当shared_ptr不指向这块内存或被摧毁时,计数器则会减一,当计数值为零时,该动态内存就会被释放。

auto p = make_shared<int> (10);
p1 = p;//p指向对象的引用计数加一
		//递减原来p1指向的对象的引用计数

(5)释放shared_ptr指向的动态内存
shared_ptr通过析构函数来释放销毁对象,注意shared_ptr作用域的问题和其所管理的对象会在什么时候释放掉。
如下,离开作用域后p会销毁,但函数会返回一个副本,所以计数仍大于0,该区域存在。

shared_ptr<int> test1()
{
    shared_ptr<int> p(new int(11));
    return p;
}
int main()
{
    auto p = test1();
    cout<<*p<<endl;
    return 0;
}

2.unique_ptr

unique顾名思义就是该指针所指的对象只能由其“独享”,某一时刻只能有一个unqiue_ptr指向一个给定的对象,所以当unique_ptr被销毁,其指向的内存也会被释放。
(1)初始化
类似于shared_ptr,不同在于其不支持拷贝,而是需要特殊的函数来转移“所有权”。

unique_ptr<int> p1;
unique_ptr<string>p2(new string("unique");
unique_ptr<int> p3(new int(10));

unique_ptr p4(p3); //错误
p1 = p3;//错误

(2)相关操作
在这里插入图片描述
release返回的指针是所指向对象的指针,利用此来转移”所有权”。
reset用于更改指针指向的对象。

unique_ptr<string> p2(p1.release()); //p1将被置空
unique_ptr<string> p3(new string("adad"));
p3.reset(p2.release());//reset释放了p3原来指向的内存,并指向p2指向的对象

(3)用于管理动态数组
在这里插入图片描述

unique_ptr<int[]> up(new int[10]);
up.release();//自动调用delete[]销毁其指针

3.weak_ptr

weak_ptr用于指向由shared_ptr管理的对象,是一种不控制所指向对象生存周期的智能指针,即它不会改变shared_ptr的引用计数,即使有weak_ptr指向一个对象,当计数为0时,该对象也还是会被释放。
(1)相关操作
在这里插入图片描述
由于所指向的对象可能已经被释放了,所以不能直接用weak_ptr去直接访问对象,可以调用上图中的lock。lock会检查所指对象是否存在,如果存在则会返回一个指向该对象的shared_ptr。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值