【C++打怪之路Lv6】-- 内存管理

简介: 【C++打怪之路Lv6】-- 内存管理

前言


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来手动调用构造函数。

 

目录
相关文章
|
10天前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
51 21
|
1天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
10 4
|
1天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
9 4
|
1天前
|
存储 算法 调度
【C++打怪之路Lv11】-- stack、queue和优先级队列
【C++打怪之路Lv11】-- stack、queue和优先级队列
12 1
|
1天前
|
存储 算法 C++
【C++打怪之路Lv10】-- list
【C++打怪之路Lv10】-- list
7 1
|
1天前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
8 1
|
1天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
6 1
|
1天前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
6 1
|
2天前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
9 0
|
2天前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
9 0