行业知识
【C++】深入了解C++内存管理
个人主页:救赎小恶魔
欢迎大家来到小恶魔频道
好久不见,甚是想念
今天我们要深入讲述C++内存管理
目录
1.C++的内存分布
2.C/C++言中动态内存管理方式
1.C语言的管理方式
2.C++的管理方式
new
delete
3.operator new与operator delete函数
operator new
operator delete
4.new和delete的实现原理
new的实现原理
delete的实现原理
new T[N]的原理
delete[]的原理
5.概念辨析
1.malloc/free和new/delete的区别
1. 内存泄漏的定义
2. 内存泄漏的原因
3. 内存泄漏的后果
4. 内存泄漏的检测与解决
引言:
当我们学习完类与对象,我们就要进一步学习C++,和C语言一样,我们学完了一些基础知识,就要了解他的内部管理,所以这一节讲解的是C++的内存管理机制
1.C++的内存分布
首先先看一下C++的内存分类图
数据段就是我们所说的全局变量,代码段是我们所说的常量区,我们需要重点关注的是堆区,因为这部分是由我们自己控制的
让我们做几个题去了解一下对内存分布的掌握
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"; 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);} 讲解:
- 第一个globalVar,它是全局变量,全局变量和静态变量放到数据段(静态区),而常量放到常量区。所以是 C
- 第二个staticGlobalVar是静态变量,生命周期在函数之前就创建好了,同样的放到数据段(静态区)。所以也是 C
- 第三个staticVar是函数内的静态变量,同上存放到数据段(静态区),并且它的生命周期贯穿整个程序执行周期。所以也是 C
- 第四个localVar是局部变量,存放到栈上,是 A
- 第五个num1是局部变量,但是它是数组,存放到栈上。也就是 A
- 第六个char2根num1一样都是数组,是局部变量,尽管没有规定大小,但能观察到有五个字节,放到栈上。 A
- 第七个*char2,这个用图讲解一下,首先是字符串存放到了常量区,我们在栈上创建了数组,然后吧常量区的字符串复制到了数组在栈中开辟的空间里面,然后数组名就是首元素的地址,*char2就是a。 A
- 第八个pChar3,这里的const修饰的是指向的内容,这里的pchar3是可以改变的,是局部指针变量,存储的是常量区的地址,存储在栈上。 A
- 第九个*pChar3,它指向的是首个字符串也就是a,所以在常量区 。 D
- 第十个ptr1,它是局部变量指针,存储在栈上 A
- 第十一个*ptr1,它是解引用了,利用malloc在堆上开辟了空间,解引用就指向了存储在堆数据的首地址,所以他在堆上。 B
所以,我们要想清楚它是解引用还是单独建立,是创建空间,还是指向空间中的首元素地址
当我们讨论变量存储在哪里时,通常涉及到几个关键区域:栈(Stack)、堆(Heap)、数据段(Data Segment,又称静态区)、和代码段(Code Segment,又称常量区)。每种类型的变量根据其特性和声明周期被存储在这些区域中的相应位置
- 栈是用于存储局部变量、函数参数等的内存区域。当一个函数被调用时,其局部变量和一些书keeping信息被推入栈中;当函数执行完成,这些信息被从栈上弹出。栈是自动管理的,开发者无需手动分配或释放内存。
- 堆是用于动态内存分配的内存区域。不同于栈,开发者需要显式地从堆上分配内存(如使用malloc或new),并在不再需要时释放这些内存(如使用free或delete)。
- 数据段,又称为静态区,用于存储全局变量、静态变量等。这些变量的生命周期贯穿整个程序执行期,因此它们被存储在一个特定的、持久的内存区域中。
- 代码段,又称为常量区,用于存储程序的执行代码和常量数据,如字符串字面量。这部分内存是只读的,用来保证程序代码的安全性。
2.C/C++言中动态内存管理方式
1.C语言的管理方式
在C语言中,动态内存管理是通过一组标准库函数完成的,包括malloc, calloc, realloc, 和 free。这些函数允许程序在运行时动态地分配、调整和释放堆内存,这是对于管理变化的数据量和大小特别有用的能力。下面是这些函数的基本用法和它们之间的区别:
malloc
- 用法:
void* malloc(size_t size);
- 功能:分配指定字节数的未初始化内存。它返回一个指向分配的内存的指针。如果分配失败,返回NULL。
- 示例:
#include #include using namespace std;int main() { // allocate memory of int size to an int pointer int* ptr = (int*) malloc(sizeof(int)); // assign the value 5 to allocated memory *ptr = 5; cout
- 用法:
上一篇:娱乐服务器怎么建设的啊?
下一篇:在服务器怎么添加d盘?