C++老鸟日记015 动态存储分配、new、delete用法及注意事项、堆&栈

微信公众号: 星点课堂

新浪微博:女儿叫老白

网易云课堂:女儿叫老白

网易云课堂免费课程:《C++跨平台开发中的编译错误》

-----------------------------------------------------------------------------

(4.1.1)

       用C++语言开发时,大家都有一个痛点:自己管理内存。也就是自己要处理内存申请、释放。java或者脚本语言就不存在这个问题,因为java有垃圾回收器。实际上,真正掌握号一些开发原则后,我们就不用太担心内存管理问题。下面我们就看一下C++开发中内存管理的原则:

       1. 使用new、delete进行内存的申请、释放操作,避免使用malloc、free。原因是使用new、delete语法时,编译器会调用对象的构造和析构函数,而malloc、free只负责申请一定长度的内存或者释放指定的内存,并没有面向对象时的构造和析构操作。

       2. 如果只是临时申请内存(比如在一个函数调用中),那么请在所有的return语句之前释放这些内存。最好的习惯是,写完new语句,马上写delete语句,然后才写其他代码。比如:

       int function(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) {

              delete pInt;    // 请注意,使用的是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. 总之,不要过于担心内存管理问题,掌握了基本原则,并且细心编程就不怕

猜你喜欢

转载自blog.csdn.net/baizy77/article/details/82532038
今日推荐