易语言实地培训长期招生 QQ1615457736

乐易论坛

 找回密码
 立即注册

微信登录

微信扫码,快速开始

QQ登录

用QQ账号登陆

导航
导航
培训
培训
产品
产品
易歪歪客服聊天助手——永久免费阿里云服务器最高¥1888云产品通用代金券我要租广告
易歪歪客服聊天助手——永久免费阿里云服务器低至10元/月我要租广告
易歪歪客服聊天助手——永久免费最高2000云产品通用代金券我要租广告
查看: 3521|回复: 1
收起左侧

很久没法贴了 今天遇到了个问题 跟大家共享一下

[复制链接]
  • TA的每日心情

    2019-5-9 10:31
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    发表于 2017-5-23 17:33:21 | 显示全部楼层 |阅读模式

    乐易编程网免费注册!抓住机会哦!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    今天在项目中遇到一个内存泄漏的问题 一直没找到问题,结果是出在变量指针的释放上面, 写C++的时候 对内存管理确实需要非常严谨,不然到后面无法查明啊, 具体其实就是delete跟delete[]的用法 上没有去注意 这里mark一下

    c++中对new申请的内存的释放方式有delete和delete[两种方式,到底这两者有什么区别呢?


    1.我们通常从教科书上看到这样的说明:
    delete 释放new分配的单个对象指针指向的内存
    delete[] 释放new分配的对象数组指针指向的内存
    那么,按照教科书的理解,我们看下下面的代码:
    int *a = new int[10];
    delete a;        //方式1
    delete [] a;     //方式2
    肯定会有很多人说方式1肯定存在内存泄漏,是这样吗?

    (1). 针对简单类型 使用new分配后的不管是数组还是非数组形式内存空间用两种方式均可 如:
       int *a = new int[10];
       delete a;
       delete [] a;
       此种情况中的释放效果相同,原因在于:分配简单类型内存时,内存大小已经确定,系统可以记忆并且进行管理,在析构时,系统并不会调用析构函数,
       它直接通过指针可以获取实际分配的内存空间
    ,哪怕是一个数组内存空间(在分配过程中 系统会记录分配内存的大小等信息,此信息保存在结构体_CrtMemBlockHeader中,
       具体情况可参看VC安装目录下CRT\SRC\DBGDEL.cpp)

    (2). 针对类Class,两种方式体现出具体差异
       当你通过下列方式分配一个类对象数组:
       class A
       {
       private:
          char *m_cBuffer;
          int m_nLen;
       public:
          A(){ m_cBuffer = new char[m_nLen]; }
          ~A() { delete [] m_cBuffer; }
       };
       A *a = new A[10];
       delete a;         //仅释放了a指针指向的全部内存空间 但是只调用了a[0]对象的析构函数 剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏
       delete [] a;      //调用使用类对象的析构函数释放用户自己分配内存空间并且   释放了a指针指向的全部内存空间
    所以总结下就是,如果ptr代表一个用new申请的内存返回的内存空间地址,即所谓的指针,那么:
       delete   ptr   代表用来释放内存,且只用来释放ptr指向的内存。
       delete[]   rg   用来释放rg指向的内存,!!还逐一调用数组中每个对象的destructor!!
       对于像int/char/long/int*/struct等等简单数据类型,由于对象没有destructor,所以用delete 和delete [] 是一样的!但是如果是C++对象数组就不同了!


    易语言实地培训,报名联系QQ 1615457736
    [超强]《易语言软件加密(防破解)技术特训》
    回复

    使用道具 举报

  • TA的每日心情

    2018-11-6 21:16
  • 签到天数: 56 天

    [LV.5]常住居民I

    发表于 2017-5-27 14:14:33 | 显示全部楼层
    厉害了我的哥
    易语言实地培训,报名联系QQ 1615457736
    [超强]《易语言软件加密(防破解)技术特训》
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    乐易推荐上一条 /6 下一条

    QQ|网站地图|Archiver|手机版|小黑屋|乐易论坛 ( 湘ICP备19007035号-2 )

    GMT+8, 2019-10-20 19:53 , Processed in 0.090168 second(s), 78 queries .

    Powered by Discuz! X3.4 Licensed

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表