C++中的智能指针

C++里面有四个智能指针,分别为auto_ptr, unique_ptr, shared_ptr, weak_ptr,

其中auto_ptr已经被c++11弃用。

智能指针的作用是管理一个指针。因为存在以下现象:申请的空间在函数结束时忘记释放,造成内存泄漏,使用智能指针可以避免这个问题,因为智能指针是一个类,当超出了这个类的作用范围,类会自动调用析构函数,进而释放资源,所以智能指针的原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。

1.auto_ptr:存在潜在的内存崩溃问题!

将一个指针赋值给另一个指针时,删除了其中一个指针,在访问另一个指针时候,会发生内存崩溃问题!

2.unique_ptr:

(替换auto_ptr)unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。当程序试图将一个 unique_ptr 赋值给另一个时,如果源 unique_ptr 是个临时右值,编译器允许这么做;如果源 unique_ptr 将存在一段时间,编译器将禁止这么做。Unique_ptr也可以通过std::move()的方法将一个Unique_ptr转移给另一个Unique_ptr,但是同样会导致原来的Unique_ptr无法调用。

3.shared_ptr

shared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。从名字share就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。当我们调用reset()时,当前指针会释放资源所有权,计数减一。当计数等于0时,资源会被释放。

shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针。

成员函数:

use_count 返回引用计数的个数

unique 返回是否是独占所有权( use_count 为 1)

swap 交换两个 shared_ptr 对象(即交换所拥有的对象)

reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少

get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是一样的.

以下为代码演示:
 

int main(void)
{
    //shared_ptr
    //use_count()返回对同一变量的引用个数
    //unique 检查use_count 是否为1
    //reset() 放弃所有权
    //swap()交换所有权
    //get()返回内部对象指针
    shared_ptr<int> p1(new int(5));
    shared_ptr<int> p2 = p1;
    //cout << p1.use_count()<<" " << p2.use_count();  
    // 2 2
    //cout << p1.unique();
    //0
    shared_ptr<int> p3(new int(22));
    //cout << p3.unique();
    //1
    swap(p1, p3);
    //cout << p1.use_count()<<" " << p3.use_count();
    //1 2
    p1.reset();
    //cout << p1.use_count() << " " << p3.use_count();
    // 0 2
    //cout << *p1;
    // 报错 因为已经被释放
    //cout << p2.get() << " " << p3.get();
    // 0097FDE0 0097FDE0  
    

4.Weak_ptr:

share_ptr虽然已经很好用了,但是有一点share_ptr智能指针还是有内存泄露的情况,当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄漏。

weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象. 进行该对象的内存管理的是那个强引用的shared_ptr, weak_ptr只是提供了对管理对象的一个访问手段。weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少。weak_ptr是用来解决shared_ptr相互引用时的死锁问题,如果说两个shared_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。它是对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值