C++智能指针简介

C++智能指针是一种特殊的指针类,它可以自动管理内存并避免常见的内存问题,比如内存泄漏和悬空指针。C++11引入了两种主要的智能指针:std::unique_ptr和std::shared_ptr。

std::unique_ptr
std::unique_ptr是一个独占式智能指针,它拥有对动态分配内存的唯一所有权,即同一时间内只能有一个std::unique_ptr对象指向该内存。当该对象被销毁时,它会自动释放所管理的内存。

使用std::unique_ptr时,我们需要将new表达式返回的原始指针传递给std::unique_ptr的构造函数,例如:

c
std::unique_ptr ptr(new int(42));
在上面的例子中,我们通过new表达式创建了一个int类型的对象,并将其地址传递给std::unique_ptr的构造函数。由于ptr是std::unique_ptr类型的对象,因此它会在离开作用域时自动释放该内存,从而避免了内存泄漏。

需要注意的是,std::unique_ptr不支持复制和赋值操作,因为这可能会导致多个智能指针对象同时拥有同一块内存所有权,进而导致程序的错误行为。如果需要共享所有权,应该使用std::shared_ptr。

std::shared_ptr
std::shared_ptr是一个共享式智能指针,多个std::shared_ptr对象可以共同拥有对同一块内存的所有权。它使用引用计数来跟踪内存的使用情况,即记录当前有多少个std::shared_ptr对象引用了该内存块。当最后一个引用该内存块的std::shared_ptr对象被销毁时,它会自动释放所管理的内存。

使用std::shared_ptr时,我们同样需要将new表达式返回的原始指针传递给std::shared_ptr的构造函数,例如:

c
std::shared_ptr ptr(new int(42));
在上面的例子中,我们创建了一个int类型的对象,并将其地址传递给std::shared_ptr的构造函数。此时,ptr和其他引用相同内存块的std::shared_ptr对象都会增加该内存块的引用计数。当最后一个std::shared_ptr对象被销毁时,它会自动释放所管理的内存。

需要注意的是,std::shared_ptr在处理循环引用问题时需要特别小心,因为两个std::shared_ptr对象可能相互引用,导致它们的引用计数永远不为0,从而导致内存泄漏。为了避免这种情况,我们可以使用std::weak_ptr来打破循环引用关系。

std::weak_ptr
std::weak_ptr是一个弱引用智能指针,它可以监视由std::shared_ptr的物理的内存块,但不会增加该内存块的引用计数。当最后一个引用该内存块的std::shared_ptr对象被销毁时,std::weak_ptr也会失效。

使用std::weak_ptr时,我们需要通过std::shared_ptr对象的weak_ptr()方法来创建一个std::weak_ptr对象,例如:

c
std::shared_ptr ptr(new int(42));
std::weak_ptr weakPtr = ptr;
在上面的例子中,我们首先创建了一个std::shared_ptr对象ptr,然后通过ptr的weak_ptr()方法创建了一个std::weak_ptr对象weakPtr。此时,weakPtr和ptr都指向同一块内存,但它们的引用计数不同。当最后一个引用该内存块的std::shared_ptr

另外还有Auto_ptr但已经过时所以不做介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值