当前位置: 首页 > news >正文

C++第二节:C/C++内存管理

1.C/C++内存分布

【说明】

  1. 又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
  3. 用于程序运行时动态内存分配,堆是可以上增长的。
  4. 数据段--存储全局数据和静态数据。
  5. 代码段--可执行的代码/只读常量。

 2.C++内存管理方式

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因 此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理


 2.1 new/delete操作内置类型

void Test()
{
      // 动态申请一个int类型的空间
      int* ptr4 = new int;
  
      // 动态申请一个int类型的空间并初始化为10
      int* ptr5 = new int(10);
  
      // 动态申请10个int类型的空间
      int* ptr6 = new int[3];
      delete ptr4;
      delete ptr5;
      delete[] ptr6;
}

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使new[]和delete[],注意:匹配起来使用。

 2.2 new和delete操作自定义类型

class A
{
public:
     A(int a = 0)
     : _a(a)
     {
         cout << "A():" << this << endl;
     }
     ~A()
     {
         cout << "~A():" << this << endl;
     }
private:
     int _a;
};

int main()
{
     // new/delete 和 malloc/free最大区别是 
     //new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数
     A* p1 = (A*)malloc(sizeof(A));
     A* p2 = new A(1);
     free(p1);
     delete p2;
     // 内置类型是几乎是一样的
     int* p3 = (int*)malloc(sizeof(int)); // C
     int* p4 = new int;
     free(p3);
     delete p4;
     A* p5 = (A*)malloc(sizeof(A)*10);
     A* p6 = new A[10];
     free(p5);
     delete[] p6;
     return 0;
}

注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与 free不会

3.operator new与operator delete函数

new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间,delete在底层通operator delete全局函数来释放空间。

operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的

4.内存泄漏

4.1 什么是内存泄漏,内存泄漏的危害

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

4.2 如何避免内存泄漏

1. 工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。ps:这个理想状态。但是如果碰上异常时,就算注意释放了,还是可能会出问题。需要下一条智能指针来管理才有保证。

2. 采用RAII思想或者智能指针来管理资源。

3. 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。

4. 出问题了使用内存泄漏工具检测。ps:不过很多工具都不够靠谱,或者收费昂贵。

总结一下:

内存泄漏非常常见,解决方案分为两种:

1、事前预防型。如智能指针等。

2、事后查错型。如泄漏检测工具。

相关文章:

  • Mysql convert函数、convert用法、字符串转数字、字符串转日期、类型转换函数
  • 探索C/C++的奥秘之list
  • 第十三届青蓝桥杯青少年Scratch省赛真题——报数游戏
  • smplx 和smpl转换
  • NUMA架构介绍
  • 【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计
  • 关于软件测试中的bug
  • 使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile
  • 破局AI算力瓶颈:C++如何铸就大模型时代的性能基石
  • 【轮廓检测详解】
  • 从像素到体验:解码UI设计的未来进化论
  • R语言绘图:韦恩图
  • pt-archiver删除数据库的数据表/各种报错类型
  • IP协议、DNS协议、DHCP协议、Telent协议的记忆总结
  • deepseek在pycharm 中的配置和简单应用
  • 在UI设计中使用自定义控件
  • PHP之连接Mysql
  • BambuStudio学习笔记:I18N类
  • Docker小游戏 | 使用Docker部署DOS游戏合集
  • angular+nodejs问卷调查系统
  • 官方在家做兼职的网站/百度浏览器网站入口
  • java开发网站怎么做/球队排名世界
  • 网站手机版怎么做/seo基础入门视频教程
  • 做网站靠教育赚钱/关键词优化公司靠谱推荐
  • 怎么做淘宝客网站赚钱/青岛seo服务
  • 全国物流网站/的网站建设