ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

动态内存管理(C++)

2019-05-25 11:51:30  阅读:192  来源: 互联网

标签:malloc 调用 管理 C++ 内存 动态内存 operator new delete


内存管理方式

C++通过new/delete操作符进行动态内存管理

操作内置类型

void Test
{
    int* ptr1 = new int;    //动态申请一个int类型的空间
    int* ptr2 = new int(10);//动态申请一个int类型的空间并初始化为10
    int* ptr3 = new int[10];//动态申请10个int类型的空间
    delete ptr1;
    delete ptr2;  //释放单个空间
    delete[] ptr3;//释放连续的空间
}

操作自定义类型

申请自定义类型空间时,new会调用构造函数,delete会调用析构函数

new/delete底层

  • new和delete底层分别通过operator new来申请空间和operator delete来释放空间
  • operator new和operator delete不是运算符重载而是全局函数
  • operator new和operator delete时malloc和free的封装,但是错误时会抛异常

实现原理

new

  • 调用operator new申请空间
  • 在申请的空间执行构造函数

delete

  • 在申请的空间执行析构函数
  • 调用operator delete释放空间

new[n]

  • 调用operator new[n]申请空间,实际调用operator new完成对n个对象空间的申请
  • 在申请的空间执行n次构造函数

delete[n]

  • 在申请的空间执行n次析构函数
  • 调用operator delete[n]释放空间,实际调用operator delete来释放空间

定位new表达式

  • 在已分配的原始内存空间中调用构造函数初始化一个对象
  • new(place_address)type或new(place_address)type(initializer-list),place_address必须是一个指针,initializer-list是类型的初始化列表
  • 一般配合内存池使用,因为内存池分配的内存没有初始化,所以如果自定义类型的对象,需要定位new表达式进行显式调用构造函数进行初始化

new/delete和malloc/free

相同

都是从堆上申请空间,并且需要手动释放

不同

  • malloc/free是函数,new/delete是操作符
  • malloc/free只负责动态分配内存空间,new/delete除了动态分配内存空间还会调用构造函数完成对象的初始化和调用析构函数完成空间资源的清理
  • malloc需手动计算大小且返回值为void*,使用时必须强转,new不需要计算大小,并且返回对应类型的指针
  • malloc申请失败返回NULL,new申请失败会抛异常,所以malloc使用需判空,new使用需捕获异常
  • new/delete比malloc/free效率低点,因为new/delete底层封装了malloc/free

内存泄漏

内存泄漏并不是指内存在物理上消失,而是指应用程序分配某段内存后,失去了对该段内存的控制,即动态开辟的内存空间未释放

后果

后果是慢性的,程序会越来越慢,内存越来越小,最终导致程序崩溃

分类

  • 堆内存泄漏:程序执行中通过malloc/calloc/realloc/new等在堆中分配的一块内存,用完必须调用相应的free或delete释放内存,否则会导致堆内存泄漏
  • 系统内存泄漏:程序使用系统分配的资源,例如:套接字、文件描述符、管道等没有对应函数释放掉,会导致系统内存泄漏

避免

  • 事前预防:工程前期良好的设计规范,养成良好的编码对法,申请的内存匹配释放;采用RAII思想或指针指针来管理资源
  • 事后查错:使用内存泄漏工具检测

标签:malloc,调用,管理,C++,内存,动态内存,operator,new,delete
来源: https://blog.csdn.net/swo_ows/article/details/90544825

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有