你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C++的内存泄漏

[复制链接]
gaosmile 发布时间:2020-5-30 20:17

对于C++的内存泄漏,总结一句话:就是new出来的内存没有通过delete合理的释放掉!

一、程序循环new创建出来的对象没有及时的delete掉,导致了内存的泄露;
代码如下:


  1. #include <iostream>
  2. #include <new.h>
  3. using namespace std;

  4. void out_of_memroy()
  5. {
  6.     cout << "ERROR:内存已耗尽!" << endl;
  7. }
  8. int main()
  9. {
  10.     set_new_handler(out_of_memroy);//注意参数传递的是函数的地址;
  11.     while(1)
  12.     {
  13.         new int[1000];
  14.     }
  15.     return 0;
  16. }
复制代码


以上代码会在堆区疯狂的动态分配内存空间,导致系统内存耗尽时自动调用set_new_handler参数列表中的函数,打印出ERROR:内存已耗尽!如下图:

微信图片_20200530201551.png

二、delete掉一个void*类型的指针,导致没有调用到对象的析构函数,析构的所有清理工作都没有去执行从而导致内存的泄露;
代码如下:


  1. class Object {
  2. private:
  3.     void* data;
  4.     const int size;
  5.     const char id;
  6. public:
  7.     Object(int sz, char c):size(sz), id(c){
  8.     data = new char[size];
  9.     cout << "Object() " << id << " size = " << size << endl;
  10.     }
  11.     ~Object(){
  12.     cout << "~Object() " << id << endl;
  13.     delete []data;
  14.     }
  15. };
复制代码


紧接着使我们的main函数:


  1. int main() {
  2. Object* a = new Object(10, 'A');//Object*指针指向一个Object对象;
  3. void* b = new Object(20, 'B');//void*指针指向一个Object对象;
  4. delete a;//执行delete,编译器自动调用析构函数;
  5. delete b;//执行delete,编译器不会调用析构函数,导致data占用内存没有得到回收;
  6. cout << "Press any key to continue... ..." << endl;
  7. getchar();
  8. return 0;
  9. }
复制代码


执行结果如下图:

微信图片_20200530201555.png

从执行结果看到,并没有执行b指针(void*)所指对象的析构函数,所以delete一个void*的指针可能会造成内存上的泄露!

三、new创建了一组对象数组,内存回收的时候却只调用了delete而非delete []来处理,导致只有对象数组的第一个对象的析构函数得到执行并回收了内存占用,数组的其他对象所占内存得不到回收,导致内存泄露;

代码如下:


  1. class Object1
  2. {
  3.     int a;
  4.     int b;
  5. };

  6. int main() {
  7. Object1* arry1 = new Object1[100];//创建包含100个Object1的对象数组arry1并返回数组首地址;
  8. Object1* arry2 = new Object1[100];//创建包含100个Object1的对象数组arry2并返回数组首地址;
  9. delete []arry1;//回收了数组arry1里的所有对象动态创建时占用的内存空间;
  10. delete  arry2;//回收了数组arry2里的第一个对象动态创建时占用的内存空间,导致其他99个对象的内存空间泄露;

  11. cout << "Press any key to continue... ..." << endl;
  12. getchar();
  13. return 0;
  14. }
复制代码


收藏 评论1 发布时间:2020-5-30 20:17

举报

1个回答
likang1202 回答时间:2020-5-31 14:08:47
谢谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版