前言
C 或 C++ 为什么要有内存管理
C和C++需要内存管理的原因是
为了有效地控制动态内存分配与回收,防止内存泄漏和野指针,确保程序运行效率和稳定性。
C/C++ 内存分布
C/C++将这些代码和变量等存在哪?
代码段 | 存储可执行程序的代码和只读常量 |
数据段 | 存储已初始化的全局变量和静态变量 |
堆 | 用于程序运行时动态内存分配,从低地址向高地址增长 |
栈 | 又叫堆栈,存储非静态局部变量/函数参数和返回值等,从高地址向低地址增长 |
那看看以下staticVar、localVal、char2、pChar3、ptr等存放在哪?
int globalVar = 1; static int staticGlobalVar = 1; int main() { static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; const char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof(int) * 4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); free(ptr1); free(ptr3); return 0; }
C语言中动态内存管理方式
具体使用看该篇文章,这里简述保姆级教学 - C语言 之 动态内存管理
malloc
分配内存,开空间
calloc
开空间并初始化
realloc
对开空间的大小进行灵活调整
free
释放动态内存开辟的空间
C++内存管理方式(与C语言对比)
前奏
在学习C语言,我们是怎么开辟新空间和释放掉的?
虽说C++兼容C语言,那来到C++了,还是得升级一下的
那C++是如何申请和释放空间的呢?
new/delete 操作内置类型
小结
malloc 开空间
new 开空间并初始化
new/delete 操作自定义类型
new 和 delete 的实现原理
new的原理 | (operator new)先申请空间,再调用构造 |
delete的原理 | 先调用析构,再(operator delete)释放空间 |
new T[N]的原理 | (operator new[] ->(实际上是operator new))先申请空间,再调用N次构造 |
delete T[N]的原理 | 先调用N次析构,再(operator delete[] ->(实际上是operator delete))释放空间 |
定位new表达式
定位new表达式允许在已分配的内存上执行构造函数以初始化对象。
通常,使用new操作符为对象动态分配内存。
为了优化性能,有时会采用内存池技术,通过malloc分配一大块内存。内存池减少了与堆的交次数,提高了内存分配效率。
对于通过malloc分配的自定义类型内存,必须使用定位new来手动调用构造函数。