C++智能指针的概念及用法(unique_ptr/shared_ptr/weak_ptr)

本文介绍了C++中的三种智能指针:unique_ptr(不可共享,防止野指针),shared_ptr(可共享,自动管理引用计数),以及weak_ptr(弱引用,不增加引用计数)。它们在内存管理和安全性方面各有特点,帮助开发者避免内存泄漏和野指针问题。
摘要由CSDN通过智能技术生成

一.智能指针概念

智能指针上并不是指针,而是封装了指针的类,当我们在堆区开辟内存时,为了避免内存泄漏的情况需要手动删除该区内存,而智能指针通过对于指针的封装使得我们无需手动管理内存,而是会在出作用域时自动释放那部分内存空间。

二. unique_ptr

unique_ptr是不可以被共享的智能指针,意思是一旦一个unique_ptr被创建,它不能赋值给另一个unique_ptr,因为在其底层把删除了拷贝构造函数,这么做的目的是防止出现野指针,提高安全性。
举个例子:两个unique_ptr维护同一部分内存,其中一个unique_ptr出作用域被自动删除,内存被释放,而此时另一个unique_ptr指向的还是那部分内存,即其指向了一部分不可用的内存区域,会导致野指针的出现。
我们可以用以下方法创建unique_ptr

    unique_ptr<Entity> E(new Entity());
	unique_ptr<Entity> E = make_unique<Entity>();

实际使用中,因为考虑安全性,防止new操作符异常,更推荐第二种写法

三. shared_ptr

shared_ptr与unique_ptr有所不同,它可以被共享,即可以赋值给其它同类,它会额外申请一部分内存,用来存储叫做控制块的数据结构,它记录着有多少个引用计数,即有多少指针与它共享同一块内存,发生拷贝,计数加一,析构发生, 计数减一,当计数器等于0的时候,就把对象析构掉。

    shared_ptr<Entity> E(new Entity());
	shared_ptr<Entity> E = make_shared<Entity>();

由于make_shared效率更快,且安全性更高,实际使用建议用此方法

四. weak_ptr

weak_ptr 是为了shared_ptr而生的智能指针,可以被shared_ptr赋值,但它不增加引用计数,但也可以访问修改资源。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值