博主介绍:程序喵大人
- 35- 资深C/C++/Rust/Android/iOS客户端开发
- 10年大厂工作经验
- 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
- 《C++20高级编程》《C++23高级编程》等多本书籍著译者
- 更多原创精品文章,首发gzh,见文末
- 记得订阅专栏,以防走丢
C++基础系列专栏
C语言基础系列
C++大佬养成攻略
在C++编程中,内存管理是一个至关重要的概念。
要深入理解内存管理,我们肯定要了解堆内存和栈内存的基本概念、区别以及它们的动态分配和释放方法。还需要深入理解相关内存分配函数malloc
、calloc
、realloc
的用法。
栈内存是由编译器自动管理的内存区域,用于存储局部变量、函数参数和返回地址等。栈内存的分配和释放是自动进行的:
栈内存具有快速分配和释放的特点,但其大小是固定的,一般也就8M左右,不能动态调整。
堆内存是由程序员手动管理的内存区域,用于动态分配内存。
你通过malloc
、calloc
、realloc
等函数可以在堆上分配内存,通过free
函数释放内存。
堆内存的大小不固定,可以动态调整,但需要程序员负责内存的管理,容易出现内存泄漏等问题,我们常说的内存泄露问题指的更多的就是堆内存的泄露。
free
函数释放内存。malloc
动态分配空间malloc
函数用于在堆上分配指定大小的内存块。函数声明形式为:
void* malloc(size_t size);
size
:要分配的字节数。NULL
。示例代码:
int* ptr = (int*)malloc(sizeof(int) * 10); // 分配10个int类型的内存空间
if (ptr == NULL) {
// 处理内存分配失败的情况
}
calloc
分配并初始化内存calloc
函数用于在堆上分配内存并初始化为0。函数声明形式为:
void* calloc(size_t num, size_t size);
num
:要分配的元素个数。size
:每个元素的字节数。NULL
。示例代码:
int* ptr = (int*)calloc(10, sizeof(int)); // 分配10个int类型的内存空间,并初始化为0
if (ptr == NULL) {
// 处理内存分配失败的情况
}
realloc
调整内存大小realloc
函数用于调整已分配内存块的大小。函数声明形式为:
void* realloc(void* ptr, size_t size);
ptr
:指向要调整大小的内存块的指针。size
:新的内存块大小(字节数)。NULL
,原内存块保持不变。示例代码:
int* ptr = (int*)malloc(sizeof(int) * 10); // 初始分配10个int类型的内存空间
if (ptr == NULL) {
// 处理内存分配失败的情况
}
// 使用realloc调整内存大小
ptr = (int*)realloc(ptr, sizeof(int) * 20);
if (ptr == NULL) {
// 处理内存调整失败的情况,注意原内存块仍然有效
}
free
释放内存free
函数用于释放之前通过malloc
、calloc
或realloc
分配的内存空间。函数声明形式为:
void free(void* ptr);
ptr
:指向要释放的内存块的指针。示例代码:
int* ptr = (int*)malloc(sizeof(int) * 10); // 分配10个int类型的内存空间
if (ptr == NULL) {
// 处理内存分配失败的情况
}
// 使用内存...
free(ptr); // 释放内存
ptr = NULL; // 将指针置为NULL,避免悬挂指针
以下示例展示了栈内存和堆内存的不同使用场景和特性:
#include
#include
void stackMemoryExample() {
int stackVar = 10; // 栈内存,函数返回时自动释放
printf("Stack variable: %d\n", stackVar);
}
void heapMemoryExample() {
int* heapVar = (int*)malloc(sizeof(int)); // 堆内存,需要手动释放
if (heapVar == NULL) {
fprintf(stderr, "Memory allocation failed\n");
return;
}
*heapVar = 20;
printf("Heap variable: %d\n", *heapVar);
free(heapVar); // 释放堆内存
heapVar = NULL; // 避免悬挂指针
}
int main() {
stackMemoryExample(); // 调用栈内存示例函数
heapMemoryExample(); // 调用堆内存示例函数
return 0;
}
其中
stackMemoryExample
函数使用了栈内存来存储局部变量stackVar
,当函数返回时,stackVar
会自动释放。
而heapMemoryExample
函数则使用堆内存来存储变量heapVar
,并通过malloc
分配内存,通过free
释放内存。
码字不易,欢迎大家点赞,关注,评论,谢谢!
专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得offer!训练营介绍