文章目录
前言
💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!
👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!
🚀分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!
- 避免系统崩溃或死机,提高系统的稳定性。
- 优化内存的使用,提高系统的性能。
- 提高系统的安全性,避免恶意程序通过修改内存来破坏系统的安全性。
- 避免内存资源的浪费,提高系统的资源利用率。
由此可见 ,内存管理对计算机程序发挥着至关重要的作用。
1. C/C++ 内存分布
在 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);
}
上述变量分布情况如下:
内存区域分类:
介绍主要的几个:
。栈(Stack):存储局部变量(如 localVar),以及函数调用时的参数和返回值。
。堆(Heap):存储动态分配的内存(如通过 malloc、calloc、realloc 分配的内存)。
。数据段(Data Segment):存储全局变量和静态变量(如 globalVar 和 staticGlobalVar)。
。代码段(Code Segment):存储程序的可执行代码以及只读常量(如 pChar3 所指向的字符串)。
2. C语言中的动态内存管理
C 语言提供了几种用于动态分配内存的函数:malloc
、calloc
、realloc
和 free
。这些函数用于在程序运行时动态地分配和释放内存。
2.1 malloc、calloc 和 realloc 的区别
。malloc:用于分配指定大小的内存块,内存中的内容未初始化。
。calloc:类似于 malloc,但会将内存初始化为零。它的参数为元素的数量和每个元素的大小。
。realloc:用于调整之前分配的内存块的大小,如果新大小大于原大小,可能会移动内存块的位置。(即扩容)
示例:
int* ptr1 = (int*)malloc(sizeof(int) * 4); // 分配4个int类型大小的内存块
int* ptr2 = (int*)calloc(4, sizeof(int)); // 分配并初始化4个int类型大小的内存块
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); // 重新分配内存
free(ptr1);
free(ptr3);