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

C++内存管理【new 和 delete 关键字】笔记

文章目录

    • 一、内存管理
    • 二、C++内存管理
      • (1) new 和delete 关键字
      • (2) 类成员的new 和 delete
      • (3) 底层原理(operator new 和 operator delete)
    • 三、自定义类型多开4字节空间存储对象个数
    • 四、内存池


一、内存管理

  • 内存分布:

    栈 -> 局部变量,形参,常变量;

    堆 -> 动态申请的空间;

    数据段(静态区)-> static静态变量, 全局变量;

    代码段(常量区)-> 字面量,字符串。

  • 解释变量存在哪里?

    int globalVar = 1;	// 全局变量,存在静态区
    static int staticGlobalVar = 1;	// 静态全局变量,静态区void Test()
    {static int staticvar = 1;	// 静态局部变量,静态区int localvar = 1;	//局部变量, 栈区int num1[10] = { 1,2,3,4 };	//局部变量,栈区char char2[] = "abcd";	// 局部变量,栈区。-> "abcd" 存在常量区,char2 拷贝字符串数据到栈区。// *char2 是字符‘a’,也存在栈区。const char* pChar3 = "abcd";	// const 修饰的常变量,pChar3存在栈区,指向常量区的字符串。// *pChar3 是字符串"abcd", 在常量区。int* ptr1 = (int*)malloc(sizeof(int) * 4);	// ptr1 是存储在栈上的局部变量,存储堆区的地址。// *ptr1 动态开辟的地址,在堆区。int* ptr2 = (int*)calloc(4, sizeof(int));	// 开辟4个int类型的空间,并初始化为0。int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);	// 动态扩容,调整空间大小(后面内存足够->原地扩,不够->异地扩)free(ptr1);free(ptr3);	// 一旦使用realloc, 原来地址ptr2 已经被free()了,不能在使用,也不能在free()。
    }
    

二、C++内存管理

(1) new 和delete 关键字

关键字要匹配

  • new int -> delete
  • new int[10] -> delete[]
int main()
{// 动态申请一个int类型的空间,默认随机值,不会初始化。int* p1 = new int;// 动态申请一个int类型的空间,并初始化int* p2 = new int(10);// 动态申请10个int类型的空间int* p3 = new int[10];// 动态申请10个int类型的空间int* p4 = new int[10] {10, 9, 8, 7};// 释放空间delete p1;delete p2;// 释放连续的空间delete[] p3;delete[] p4;return 0;
}

(2) 类成员的new 和 delete

class A
{
public:A(int a=0):_a(a){	cout << "A():" << this << endl;}~A(){cout << "~A()" << endl;}private:int _a;
};int main()
{// 动态开辟一个自定义类型 A 空间。-> 调用构造函数A* p1 = new A(10);	delete p1;	// 释放空间 -> 调用析构函数A* p2 = new A[10]{ 1,2,3,4,5,6,7,8 };delete[] p2;return 0;
}
  • new/delete 和 malloc/free 最大的区别是:new/delete 对于【自定义类型】除了开空间外,还会调用构造函数和析构函数
  • 在动态申请空间时,new 调用构造,delete 调用析构。malloc和free不会。

(3) 底层原理(operator new 和 operator delete)

  • new 调用 operator new + 构造
    • operator new 调用 malloc()
    • 相当于new封装operator new, operator new 封装 malloc()
    • new 的底层仍然是 malloc()函数
  • new Type[N] 调用 operator new Type[N]
    • operator new Type[N] 调用 operator new + N次构造
    • operator new 调用 malloc()
  • delete 调用 operator delete + 析构
    • operator delete 调用 free()
  • C++中 new 动态开辟失败, 使用try{}catch(exception& e){} 捕获异常
try
{function();	
}
catch (const exception& e)
{cout << "e.what()" << endl;
}

**总结:**new 最终还是调用malloc()实现; delete 最终调用free() 实现。

new -> operator new -> malloc()

delete -> operator delete -> free()

三、自定义类型多开4字节空间存储对象个数

A* p1 = new A[10];
  • 在显示写了析构函数的情况下:

    • new 开辟了44字节空间,多的4字节空间存储对象的个数,用来对p1 释放空间时 使用。

    •   /*______________________________|__4Byte__|_____40Byte_______|/|\		 /|\|		  ||		  p1指向位置|实际开空间位置*/
      
  • 不显示写析构函数,不会多开辟4字节空间。

  • 对于内置类型,也不多开辟空间。

四、内存池

池转换技术, 线程池, 连接池…

相关文章:

  • 【Leetcode】938. 二叉搜索树的范围和
  • 【QT+QGIS跨平台编译】之五十五:【QGIS_CORE跨平台编译】—【qgsmeshcalcparser.cpp生成】
  • 【C#】SixLabors.ImageSharp和System.Drawing两者知多少
  • 刷题 16 前缀和
  • 常用网络协议的学习
  • 项目实战:Qt监测操作系统物理网卡通断v1.1.0(支持windows、linux、国产麒麟系统)
  • YOLOv9图像标注和格式转换
  • 通过配置数据库事件(Event)来实现定时导出 MySQL 数据库
  • XSS简介及xsslabs第一关
  • Linux 学习笔记(1-3)
  • 【Spring】回顾反射机制
  • 2324. 生活的艰辛(网络流,最小割,最大密度子图)#困难,重点难点
  • 软件License授权原理
  • 枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)
  • 用Python实现绘画樱花树
  • hexo+github搭建个人博客
  • #Java异常处理
  • [译]如何构建服务器端web组件,为何要构建?
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CODING 缺陷管理功能正式开始公测
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java基本数据类型之Number
  • Laravel5.4 Queues队列学习
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Octave 入门
  • Odoo domain写法及运用
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python socket服务器端、客户端传送信息
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vue ES6 Jade Scss Webpack Gulp
  • vuex 学习笔记 01
  • 从伪并行的 Python 多线程说起
  • 精彩代码 vue.js
  • 前端学习笔记之观察者模式
  • 微信小程序填坑清单
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • !!Dom4j 学习笔记
  • #LLM入门|Prompt#3.3_存储_Memory
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (09)Hive——CTE 公共表达式
  • (C)一些题4
  • (补)B+树一些思想
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)汇编语言——简单程序
  • (四)图像的%2线性拉伸
  • (万字长文)Spring的核心知识尽揽其中
  • (学习日记)2024.01.19
  • (原)本想说脏话,奈何已放下
  • .bat批处理(一):@echo off
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值