C++ 11 深度学习(六)智能指针综述

以下三种智能指针均为类模板

1.shared_ptr  共享指针   ,多个指针指向同一个对象,最后一个指针被销毁时,这个对象会被释放。

2.week_ptr 是辅助shared_ptr工作的

3.unique_ptr 是独占式指针,同一时间只能有一个指针能指向该对象,该对象所有权还是可以转移出去的。

shared_ptr基础

1.共享所有权,不是被一个shaerd_ptr使用,而是被多个shared_ptr之间相互协作,shared_ptr有额外开销。

2.工作原理:采用引用计数机制,每个shared_ptr的拷贝都指向相同的内存,所以,只有最后一个指向该内存(对象)的shared_ptr指针不需要再指向对象时,那么shared_ptr才会去析构指向的对象。

3.最后一个指向该内存对象的shared_ptr在什么情况下会释放该对象?

  a.shared_ptr被析构的时候。 

  b.这个shared_ptr指向其他对象时。

4.格式:shared_ptr<指向的类型>智能指针的名字

	//智能指针p1指向new一个int类型的对象,初始值为100
	shared_ptr<int>p1(new int(100));

其中引用计数为1,该指针是一个强引用。 

5.返回值为shared_ptr

shared_ptr<int>makes(int val)
{
	return shared_ptr<int>(new int(val));
}

6.裸指针可以初始化智能指针,但是不推荐。

7.shared_ptr<int>p; 指向int的智能指针,名字为p,但目前指向的为空nullptr。'

8.make_shared函数,标准库里的函数模板,安全高效的分配和使用shared_ptr;它能在内存(堆)中分配并初始化一个对象,然后返回指向对象的shared_ptr。

shared_ptr<int>p1=make_shared<int>(100);

9. 把智能指针当作实参向函数里传递时,引用计数+1,出函数后引用计数-1。如果传递使用引用&,引用计数不会增加,如果有指针来接返回值,引用计数会增加。

10.use_count( )返回多少个智能指针指向某个对象,主要用于调试目的。

	int i = 0;
	shared_ptr<int>p1=make_shared<int>(100);
	i = p1.use_count();//引用计数为1
	auto p2(p1);//引用计数+1
	i = p1.use_count();//引用计数为2

11.unique( ) :是否该智能指针独占某个指向的对象,也就是若只有一个智能指针指向某个对象,则unique( )返回true,否则返回false。

12.reset( )复位(恢复)

   a.reset( )不带参数时,若智能指针P是唯一指向该对象的指针,则释放,并置空。若智能指针P不是唯一指向该对象的指针,则引用计数减少1,同时将P置空。

  

	shared_ptr<int>p1=make_shared<int>(100);
	p1.reset();

  b.reset( )带参数时,若智能指针P是唯一指向对象的指针,则释放并指向新的对象。若P不是唯一的指针,则只减少引用计数,并指向新的对象。

	shared_ptr<int>p1=make_shared<int>(100);
	p1.reset(new int (200));

13.get( )返回智能指针中保存的指针(裸指针),delete get出的指针,系统会报告异常。

14.swap( ) 交换两个智能指针指向的对象。

15.shared_ptr<A[ ]>P(new A[10]) 此定义系统可以自动释放。

week_ptr

1.weak_ptr是辅助shared_ptr工作,(强shared,弱weak)。

2.它是一个类模板,也是一个智能指针,这个智能指针指向一个shared_ptr管理的对象,但是weak_ptr这中指针不控制生命周期。(不会改变引用计数)

3.作用:监视shared_ptr的生命周期,是强引用的扩充(不是独立的智能指针)。weak_ptr能够监视到它的指向对象是否存在。

4.weak_ptr的创建,创建weak_ptr的时候,一般是用一个shared_ptr来初始化。强引用计数不会改变,而弱引用计数会改变。

	shared_ptr<int>p1=make_shared<int>(100);
	weak_ptr<int>p2(p1);//P2共享P1,强引用计数不会改变

5.lock( )  是检查weak_ptr所指向的对象是否存在,如果存在,这个lock返回一个指向shared_ptr,如果不存在则返回一个空的shared_ptr。存在(强引用计数+1)

6.use_count( )获取与弱指针共享对象的其他shared_ptr数量。

7.expired( )是否过期的意思,若该指针的use_count( )为0,表示该弱指针指向的对象已经不存在,则返回true,用这个函数判断所观察的资源是否释放。

8.reset( )将该指弱指针设置为空,不影响指向该对象的强引用数量,但指向该对象的弱引用计数会减少。

9.weak_ptr 和 shared_ptr是裸指针的2倍。

unique_ptr

1.同一时刻,只能有一个unique_ptr指针指向这个对象内存。

2.make_unique函数初始化并返回一个unique_ptr。

3.move移动语义,移动完后,p1为空,p2指向原p1所指。

	unique_ptr<string>p1(new string("hello"));
	unique_ptr<string>p2 = std::move(p1);

4.release( )  放弃对指针的控制权,切断指针与指针对象之间的联系,返回裸指针。将智能指针(置空),裸指针可手动delete,也可初始化另一个智能指针,或给另一个智能指针赋值。

5.转成shared_ptr,如果unique_ptr为右值,就可以将它赋值给shared_ptr。因为shared_ptr包含一个显示构造函数,可适用于将右值unique_ptr转换为shared_ptr,shared_ptr接管unique_ptr指向的内存对象。

unique_ptr是C++11引入的智能指针之一,用于管理动态分配的对象。它的作用是在对象不再需要时自动释放内存,避免内存泄漏。

unique_ptr具有以下特点:

  1. 独占所有权:每个unique_ptr只能拥有一个指针,确保了资源的独占性。
  2. 自动释放:当unique_ptr超出作用域或被显式释放时,它所管理的对象会被自动删除,无需手动调用delete。
  3. 无法复制:unique_ptr禁止复制构造和赋值操作,防止多个指针同时管理同一个对象,避免了悬空指针和二次释放的问题。
  4. 可移动:可以通过移动语义将unique_ptr转移给其他unique_ptr,实现所有权的转移。

使用unique_ptr可以有效地管理动态分配的资源,提高代码的安全性和可维护性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༄yi笑奈何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值