【c++】智能指针——实现内存的自我回收机制

目录

一、了解智能指针      

1、 智能指针:c++的自我内存回收机制的实现

      2、  智能指针是面向对象的指针,以对象的形式做指针的事;

二、介绍几种智能指针

  1、auto_ptr

2、scope_ptr

3、shared_ptr 强智能指针 带有引用计数的智能指针

4、weak_ptr 弱智能指针 可以解决强智能指针相互引用的问题


一、了解智能指针      

1、 智能指针:c++的自我内存回收机制的实现

        在以前的学习中,对于堆上内存的使用,我们一般使用new和delete来进行开辟内存和用完之后的释放内存。但总会在不经意的时候忘记delete,导致内存泄露。了解一点java语言应该知道,在java中只有new没有delete。因为java有自己的垃圾回收机制。

那么,对于内存的回收机制应该怎样理解 
         首先看这样一句代码:
          int *p = new int;
        分析这句代码:首先在对上new一个四字节的空间,p作为一个指针变量,属于栈上资源,它对堆上开辟的内存具有所有权即包括管理权和释放权。即就是说p管理对上开辟的资源。如图所示:

        栈上的资源是系统开辟,系统释放的;而堆上的资源是一般情况下是用户开辟用户释放。那么,要实现内存的自我回收机制即就是要做到用户开辟,系统释放。主要目的是为了防止内存泄露。因此,在这里c++利用智能指针来完成。

      2、  智能指针是面向对象的指针,以对象的形式做指针的事;

        先来看看对象的生成和销毁:

        对象的生成有两步:1.开辟空间;
                                            2.调用构造函数进行初始化;
       对象的销毁有两步:1.调用析构函数释放资源;
                                            2.释放空间;
        以一个对象管理对上开辟的资源,这个对象含有对堆上开辟的内存的所有权,即做着上图的p的事情;

        在我们的标准库里边有这几种智能指针:auto_ptr;当然在boost库里,有这么几种:scope_ptr(又被称为unique_ptr),scope_arr,shared_ptr,shared_arr,weak_ptr,weak_arr等我主要学习了auto_ptr、score_ptr、shared_ptr、weak_ptr这几种智能指针。因此本文也会着重介绍这几种常用的智能指针。分析每种智能指针解决了什么问题?它的缺点?以及哪种新的智能指针解决上个遗留的问题等等。

二、介绍几种智能指针

  1、auto_ptr

  该智能指针主要解决的问题是保证所有权唯一;

  首先分析这样一个过程,有三个对象生成,他们对同一块对内都具管理权权;如图:

sp1、sp2、sp3对内存都有所有权,即都可以操作开辟的内存单元。若当sp3结束释放资源后,会将堆上内存还回,则sp1、sp2会指向非法内存,当sp1或者sp2释放时,程序会崩溃,因为释放的是不可访问的内存;所以,对于这种情况的解决方法就是保证其对象的所有权唯一,如下图所示:

sp1对该堆上开辟的资源具有所有权,当sp2要指向并管理该堆上内存时,收回sp1的所有权,将权利赋给sp2;这样就保证了所有权的唯一;

对于解决这一问题的简单实现如下:(模拟实现简单的auto_ptr)

/*
    代码一:
 
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值