栈内存特点
- 自动分配与释放:由编译器自动管理,函数内局部变量在栈上分配,函数结束时自动释放。
- 速度快:分配和释放内存操作简单,速度相对堆内存快。
- 空间有限:栈的大小在程序运行前就已确定,通常较小。
堆内存特点
- 手动分配与释放:需要程序员手动使用
new
(C++)或malloc
(C语言)分配,使用delete
(C++)或free
(C语言)释放。
- 速度慢:涉及系统调用,分配和释放内存相对复杂,速度比栈慢。
- 空间大:理论上受限于系统虚拟内存大小,空间相对栈大得多。
变量在栈上分配内存方式
void stackAllocation() {
int num = 10; // 变量num在栈上分配内存
char ch = 'a'; // 变量ch在栈上分配内存
}
变量在堆上分配内存方式
void heapAllocation() {
int* ptr = new int(20); // 使用new在堆上分配内存,返回指向该内存的指针
char* str = new char[5]; // 在堆上分配一个能容纳5个字符的数组
delete ptr; // 使用delete释放堆上分配的单个int变量内存
delete[] str; // 使用delete[]释放堆上分配的数组内存
}
生命周期和内存管理区别
- 生命周期:栈上变量生命周期与所在函数相关,函数结束变量销毁;堆上变量生命周期由程序员控制,手动释放前一直存在。
- 内存管理:栈内存由编译器自动管理,无需程序员干预;堆内存需手动分配和释放,若忘记释放会导致内存泄漏。例如在上述
heapAllocation
函数中,如果没有delete ptr
和delete[] str
操作,就会造成内存泄漏。