找回密码
 立即注册
收起左侧

C++老鸟日记015 动态存储分配

5
回复
6008
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-9-7 16:08:41 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

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

x
本帖最后由 baizy77 于 2018-10-1 20:49 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白 (白振勇)
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
本套课程属于:《C++跨平台开发干货》系列课程。
-----------------------------------------------------------------------------

引言
-----------------------------------------------------------------------------
       我们都知道堆栈这个说法,但是实际上,堆和栈在内存中分别用作不同的用途,我们今天来看一下有关内存分配的问题。

正文
-----------------------------------------------------------------------------
(4.1.1)
       用C++语言开发时,大家都有一个痛点:自己管理内存。也就是自己要处理内存申请、释放。java或者脚本语言就不存在这个问题,因为java有垃圾回收器。实际上,真正掌握号一些开发原则后,我们就不用太担心内存管理问题。下面我们就看一下C++开发中内存管理的原则:
       1.使用new、delete进行内存的申请、释放操作,避免使用malloc、free。原因是使用new、delete语法时,编译器会调用对象的构造和析构函数,而malloc、free只负责申请一定长度的内存或者释放指定的内存,并没有面向对象时的构造和析构操作。
       2.如果只是临时申请内存(比如在一个函数调用中),那么请在所有的return语句之前释放这些内存。最好的习惯是,写完new语句,马上写delete语句,然后才写其他代码。比如:
       intfunction(int val) {
              int *pInt = new int;
              if(NULL != pInt) {
                     delete pInt;    // 请注意,使用的是delete;
                     pInt = NULL;
}
}

       3,如果申请了一个对象的内存,请释放一个,如果一次申请多个,请释放多个。比如:
       int*pInt = new int;
       int*pIntArray = new int[10];
……
// 只需要释放一个
       if(NULL != pInt) {
              deletepInt;    // 请注意,使用的是delete;
              pInt= NULL;
}

// 申请多个,释放多个。
if (NULL != pInt){
              delete[] pInt; // 请注意,使用的是delete[]。
              pInt= NULL;
}

4. 频繁的申请、释放内存,会导致大量的内存碎片,最后可能导致无法申请到大片的连续内存。
5. 如果您为对象申请内存并保存了对象指针,该指针被广泛引用(比如,该指针可以通过get接口访问),那么请务必保证在唯一的一处进行释放。不要多次释放,也不要忘记释放。
6. new出的内存是分配在堆上的。函数中的临时变量是分配在栈上的。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。
栈:由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等

------------------------总结 ----------------------
1. 尽量使用new、delete,而避免用malloc、free。
2. 写完new马上写delete语句。在所有return之前都要写奥。
3. delete与delete[]的区别,后者负责释放多个对象的内存。
4. 指针可以被多次引用,但是请仅在一处进行释放。
5. 可以使用vld.h检测内存泄漏。
6. 总之,不要过于担心内存管理问题,掌握了基本原则,并且细心编程就不怕。

回复

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-9-8 11:13:39 显示全部楼层
嘿  总结得很巴适。   我我申请空间一般都不释放,    因为程序运行开始我就申请一次, 不会出现释放又申请。   我想反正系统会处理就没有进行销毁, 这样好不好。   
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-9-8 18:11:15 显示全部楼层
tan 发表于 2018-9-8 11:13
嘿  总结得很巴适。   我我申请空间一般都不释放,    因为程序运行开始我就申请一次, 不会出现释放又申请 ...

如果您用C++语言编程,就需要自己释放。如果申请内存又不想释放,完全依赖程序退出时操作系统的自动处理,这样的编程方式不太友好。而且一旦内存不够,程序就无法申请新的内存。
回复 支持 反对

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-9-12 11:05:30 显示全部楼层
baizy77 发表于 2018-9-8 18:11
如果您用C++语言编程,就需要自己释放。如果申请内存又不想释放,完全依赖程序退出时操作系统的自动处理 ...

这是个问题啊。  如果我申请了空间不释放,然后再申请空间会产生申请不上。   如果我释放呢, 会释放频繁产生碎片。  这个如何是好 ?
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-9-12 14:48:21 显示全部楼层
tan 发表于 2018-9-12 11:05
这是个问题啊。  如果我申请了空间不释放,然后再申请空间会产生申请不上。   如果我释放呢, 会释放频繁 ...

如果您不是非常频繁的申请大片内存(比如秒级或毫秒级),一般问题不大。另外,如果每次明确知道需要申请的内存大小,您可以申请一块大内存,然后自行管理。
回复 支持 反对

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-9-14 21:37:55 显示全部楼层
baizy77 发表于 2018-9-12 14:48
如果您不是非常频繁的申请大片内存(比如秒级或毫秒级),一般问题不大。另外,如果每次明确知道需要申请 ...

ok  谢谢                                                                                          
回复 支持 反对

使用道具 举报

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

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了