C++智能指针

本文详细介绍了C++中的智能指针,包括unique_ptr、shared_ptr和weak_ptr的使用场景和所有权概念。unique_ptr代表专属所有权,适用于类属性和异常安全的场景;shared_ptr支持共享所有权,适合于需要多个对象共享同一内存的情况,但性能稍逊于unique_ptr;weak_ptr用于解决shared_ptr的循环引用问题。理解智能指针可以帮助更好地管理内存和对象生命周期。
摘要由CSDN通过智能技术生成

智能指针的作用

C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高 了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易 造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。

头文件:#include < memory>
C++11 中推出了三种智能指针,unique_ptr、shared_ptr 和 weak_ptr,同时也将 auto_ptr 置为废弃(deprecated)。

但是在实际的使用过程中,很多人都会有这样的问题:

不知道三种智能指针的具体使用场景
无脑只使用 shared_ptr
认为应该禁用 raw pointer(裸指针,即Widget*这种形式),全部使用智能指针

本文试图理清楚三种智能指针的具体使用场景,并讲解三种智能指针背后的性能消耗。

对象所有权

首先需要理清楚的概念就是对象所有权的概念。所有权在 rust 语言中非常严格,写 rust 的时候必须要清楚自己创建的每个对象的所有权。

但是 C++比较自由,似乎我们不需要明白对象的所有权,写的代码也能正常运行。但是明白了对象所有权,我们才可以正确管理好对象生命周期和内存问题。

C++引入了智能指针,也是为了更好的描述对象所有权,简化内存管理,从而大大减少我们 C++内存管理方面的犯错机会。

unique_ptr:专属所有权

我们大多数场景下用到的应该都是 unique_ptr。unique_ptr 代表的是专属所有权,即由 unique_ptr 管理的内存,只能被一个对象持有。所以,unique_ptr 不支持复制和赋值,如下:

auto w = std::make_unique<Widget>();
auto w2 = w; // 编译错误

如果想要把 w 复制给 w2, 是不可以的。因为复制从语义上来说,两个对象将共享同一块内存。

因此,unique_ptr 只支持移动, 即如下:

auto w = std::make_unique<Widget>();
auto w2 = std::move(w); // w2获得内存所有权,w此时等于nullptr

unique_ptr 代表的是专属所有权,如果想要把一个 unique_ptr 的内存交给另外一个 unique_ptr 对象管理。只能使用 std::move 转移当前对象的所有权。转移之后,当前对象不再持有此内存,新的对象将获得专属所有权。

如上代码中,将 w 对象的所有权转移给 w2 后,w 此时等于 nullptr,而 w2 获得了专属所有权。

因为 C++的 zero cost abstraction 的特点,unique_ptr 在默认情况下和裸指针的大小是一样的。所以内存上没有任何的额外消耗,性能是最优的。

使用场景 1:忘记 delete

unique_ptr 一个最简单的使用场景是用于类属性。代码如下:

class Box{
   
public:
 Box() : 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值