智能指针---shared_ptr

C++11新特性之智能指针—shared_ptr(共享指针)

1、为什么会有智能指针这个东西呢?C++语言本身是没有内存回收机制的(在此不得不羡慕用Java的大佬们),我们申请动态内存的时候,需要自己释放。忘记释放怎么办,能怎么办,泄漏呗!

2、C++11则引入了智能指针,智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。

所需的头文件

#include <memory>
using namespace std;

上图上代码吧

两个智能指针通过引用的方式传递指向,它们的use_count()为2,如果把其中的一个智能指针给释放了,内部会进行计数减一操作,如果不为0,那么这一块内存还不能释放。否则,可以释放该内存了。
在这里插入图片描述
在这里插入图片描述

// 普通计数引用初始化shared_ptr
	shared_ptr<int> ptr1(new int(13)); // 初始化时指向一块开辟的内存
	cout << "ptr1 count :" << ptr1.use_count() << endl; //计数值:1
	shared_ptr<int> ptr2 = ptr1;	   // 初始化时指向ptr1指向的内存地址
	cout << "ptr2 count :" << ptr2.use_count() << endl;	//计数值:2
	shared_ptr<int> ptru;			   // 只是定义的了一个shared_ptr,未初始化
	cout << "ptru count :" << ptru.use_count() << endl;	//计数值:0
	shared_ptr<int> ptrn(nullptr);	   // 定义了一个指向nullptr的shared_ptr 
	cout << "ptrn count :" << ptrn.use_count() << endl;	//计数值:

错误的初始化方式:

多次引用同一块内存地址对不同的智能指针进行初始化,会导致这一块内存 在释放时进行多次释放,程序奔溃。

	int* iptr = new int(3);		// 申请了一块内存
	shared_ptr<int> ptr3(iptr); //使用ptr3指向iptr这块内存
	cout << "ptr3 count :" << ptr3.use_count() << endl; //计数为:1
	shared_ptr<int> ptr4(iptr);	//使用ptr3指向iptr这块内存
	cout << "ptr4 count :" << ptr4.use_count() << endl; // 计数为:1

由于ptr3和ptr4是两个shared_ptr同时使用的iptr进行的初始化,那么ptr3和ptr4 的计数都是为1,程序运行结束时,它们都会对它们指向的地址进行释放,由于内存只有一块,释放两次就会程序奔溃。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值