MST

星途 面试题库

面试题:C++ 内存模型之栈与堆

在C++中,栈内存和堆内存分别有什么特点?请举例说明变量在栈上和堆上分配内存的方式,并阐述它们在生命周期和内存管理上的区别。
15.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

栈内存特点

  1. 自动分配与释放:由编译器自动管理,函数内局部变量在栈上分配,函数结束时自动释放。
  2. 速度快:分配和释放内存操作简单,速度相对堆内存快。
  3. 空间有限:栈的大小在程序运行前就已确定,通常较小。

堆内存特点

  1. 手动分配与释放:需要程序员手动使用new(C++)或malloc(C语言)分配,使用delete(C++)或free(C语言)释放。
  2. 速度慢:涉及系统调用,分配和释放内存相对复杂,速度比栈慢。
  3. 空间大:理论上受限于系统虚拟内存大小,空间相对栈大得多。

变量在栈上分配内存方式

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 ptrdelete[] str操作,就会造成内存泄漏。