MST

星途 面试题库

面试题:C++中堆和栈在内存分配上的差异

请详细阐述C++中堆和栈在内存分配方式、内存管理机制以及分配效率上的差异。
22.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

内存分配方式

  • :由编译器自动分配释放,存放函数的参数值、局部变量等。在函数执行时,相关变量会依次压入栈中,函数结束时,这些变量又会从栈中弹出。例如,在如下代码中,int a = 10; 变量 a 就被分配在栈上:
void func() {
    int a = 10;
}
  • :由程序员手动分配释放。通过 new(C++)或 malloc(C 兼容)等函数来申请一块堆内存,例如 int* ptr = new int(10);,这里通过 new 为一个 int 类型的数据在堆上分配了内存,并返回指向这块内存的指针 ptr

内存管理机制

  • :内存管理由编译器自动处理。当函数结束时,栈上的变量会自动被销毁,无需程序员手动干预。这种自动管理机制使得栈内存的使用相对简单,不容易出现内存泄漏问题。
  • :需要程序员手动管理。使用 newmalloc 分配的内存,必须使用 delete(C++)或 free(C 兼容)来释放。如果忘记释放,就会导致内存泄漏。例如:
int* ptr = new int(10);
// 如果后续没有执行 delete ptr; 就会造成内存泄漏

分配效率

  • :分配效率高。因为栈的分配和释放是由编译器自动完成,并且栈操作遵循后进先出(LIFO)原则,类似于数据结构中的栈,在栈顶进行操作,速度非常快。
  • :分配效率相对较低。堆内存的分配需要在堆内存空间中寻找合适大小的空闲块,这个过程涉及到复杂的算法(如首次适应、最佳适应等)来找到合适的内存块,并可能需要进行内存块的分割和合并等操作,因此相对栈的分配来说,效率会低一些。