内存区域
-
栈内存(Stack Memory):栈内存是由编译器自动管理的内存区域,用于存储函数的局部变量、函数参数和返回值。栈内存的大小是固定的,且由编译器决定。当函数调用时,栈内存会自动分配,当函数返回时,栈内存会自动释放。
-
堆内存(Heap Memory):堆内存是由程序员手动管理的内存区域,用于存储动态分配的内存的区域。堆内存的大小可以在运行时动态调整。程序可以使用
new
运算符在堆内存中分配内存,使用delete
运算符释放内存。 -
全局变量内存(Global Variable Memory):全局变量内存是用于存储全局变量的内存区域。全局变量在程序启动时分配内存,在程序结束时释放内存。
-
静态变量内存(Static Variable Memory):静态变量内存是用于存储静态变量的内存区域。静态变量在程序启动时分配内存,在程序结束时释放内存。
-
常量内存(Constant Variable Memory):常量内存是用于存储常量的内存区域。常量在程序编译时分配内存,在程序结束时释放内存。
// 栈内存
void foo() {
int x = 10;
}
// 堆内存
int* p = new int(10);
// 全局变量内存
int globalVar = 10;
// 静态变量内存
static int staticVar = 10;
// 常量内存
const int constVar = 10;
区域 | 定义 | 分配方式 | 释放方式 | 访问范围 | 大小 |
---|---|---|---|---|---|
栈(Stack) | 函数参数、局部变量和函数返回值的内存区域 | 自动分配 | 自动释放 | 函数内 | 固定 |
堆(Heap) | 动态分配的内存区域 | 手动分配(new) | 手动释放(delete) | 全局 | 动态扩展 |
全局变量区(Global Variable Area) | 全局变量的内存区域 | 编译时分配 | 程序结束时释放 | 全局 | 固定 |
静态变量区(Static Variable Area) | 静态变量的内存区域 | 编译时分配 | 程序结束时释放 | 文件内 | 固定 |
常量区(Constant Area) | 常量的内存区域 | 编译时分配 | 程序结束时释放 | 全局 | 固定 |
内存管理
手动内存管理
-
new
运算符用于在堆或自由存储区中分配内存。它可以为一个对象或一个数组分配内存。 -
delete
运算符用于释放堆或自由存储区中的内存,释放由new
分配的内存。它可以释放一个对象或一个数组的内存。 -
malloc
函数用于在堆中分配内存。 -
free
函数用于释放堆中的内存,释放由malloc
分配的内存。 -
calloc
函数用于在堆中分配内存并初始化为0。 -
realloc
函数用于调整堆中的内存大小。
int* p = new int; // 分配一个int大小的内存
delete p; // 释放一个int大小的内存
int* arr = new int[10]; // 分配一个int数组的内存
delete[] arr; // 释放一个int数组的内存
void* p = malloc(sizeof(int)); // 分配一个int大小的内存
free(p); // 释放一个int大小的内存
void* p = calloc(1, sizeof(int)); // 分配一个int大小的内存并初始化为0
void* p = realloc(p, 2 * sizeof(int)); // 重新分配内存大小
函数名 | 描述 | 参数 | 返回值 |
---|---|---|---|
new | 动态分配内存 | 类型和大小 | 指向分配内存的指针 |
delete | 释放动态分配的内存 | 指向内存的指针 | 无 |
malloc | 动态分配内存 | 大小 | 指向分配内存的指针 |
free | 释放动态分配的内存 | 指向内存的指针 | 无 |
calloc | 动态分配内存并初始化为0 | 数量和大小 | 指向分配内存的指针 |
realloc | 重新分配内存大小 | 指向内存的指针和新大小 | 指向重新分配内存的指针 |
new
和delete
是 C++ 中的运算符,而malloc
、free
、calloc
和realloc
是 C语言中的函数。new
和delete
可以用于对象和数组的内存分配和释放,而malloc
和free
只能用于内存块的分配和释放。new
在分配内存时会调用对象的构造函数,而delete
在释放内存时会调用对象的析构函数。malloc
和free
不会调用对象的构造函数和析构函数。- 在 C++ 中,建议使用
new
和delete
进行内存管理,而不是malloc
和free
。
智能指针
智能指针是 C++11 引入的一种内存管理方式,用于自动管理内存,避免内存泄漏和野指针。
详细可参考:C++ 指针、智能指针、引用
容器
容器是 C++ 标准库提供的一种内存管理方式,用于自动管理内存,避免内存泄漏和野指针。