💡本章重点
-
认识并了解C/C++的内存分布
-
深入并剖析C与C++中的动态内存管理
- 了解
池化技术
中的内存管理技术 - 认识
operator new
函数 - 认识
operator delete
函数
- 了解
-
了解“定位new”的概念
-
认识内存泄漏的危害
🍞一.C/C++内存分布
💡内存分布:
- 在《【C语言】动态内存管理 [进阶篇]》中曾剖析过C语言的内存分布,同学们可以跳转回顾食用呀~
👆以上就是内存划分示意图,我们可发现:
- C/C++中程序内存区域划分又称为:
虚拟进程地址空间
- 栈区:又称为堆栈,函数调用建立栈帧,栈帧主要存储非静态局部变量、函数参数、返回值等等【栈一般是有规定大小的,Linux下栈区一般是
8M
】 - 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库
- 堆区:用于程序运行时动态内存分配,Eg:malloc、calloc、new……【堆区一般有接近2G的空间】
- 静态区:存储全局数据和静态数据
- 常量区:存储常量、程序编译出的指令(即在程序执行语句的时候,都会调用这里的指令去依次执行)
👉让我们来重点关注动态内存的管理方式吧~
🍞二.动态内存管理
💡动态内存管理方式:
-
对于C语言来说:malloc、calloc、realloc、free
-
这里便涉及一道面试题:
malloc
/calloc
/realloc
的区别?- malloc就是在堆区上申请动态开辟空间
- calloc就是在malloc的的功能基础上,对已开辟的空间初始化成0,等价于
malloc + memset
- realloc是针对已有的空间进行扩容(原地扩容 or 异地扩容)
-
而对于C++来说,C语言内存管理方式仍然可以在C++中可以继续使用,但因为C语言在有些地方使用起来比较麻烦且无能为力
-
于是C++提出了自己的管理方式: