MST
星途 面试题库

面试题:C++中堆和栈内存管理在变量生命周期方面的区别

请详细阐述C++中堆内存和栈内存管理时,变量生命周期是如何确定和受影响的,分别举例说明栈上局部变量和堆上通过new分配变量的生命周期情况。
29.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

栈内存管理与变量生命周期

  1. 确定方式:栈上的局部变量生命周期从变量声明处开始,到其所在代码块结束时结束。当进入一个函数或代码块时,系统会在栈上为局部变量分配内存空间,当离开该函数或代码块时,栈上为这些局部变量分配的空间会自动被释放。
  2. 受影响因素:主要受代码块作用域影响。若在函数内部嵌套代码块,局部变量在嵌套代码块内有效,离开嵌套代码块即失效。例如:
void testStack() {
    {
        int localVar = 10; // 变量localVar在这个内部代码块开始其生命周期
        std::cout << localVar << std::endl; 
    } // 离开这个内部代码块,localVar生命周期结束,内存被自动回收
    // std::cout << localVar << std::endl; 这里访问localVar会报错,因为它已不存在
}

堆内存管理与变量生命周期

  1. 确定方式:通过new运算符在堆上分配的变量,其生命周期从new表达式执行时开始,直到使用delete运算符显式释放该内存时结束。
  2. 受影响因素:依赖于程序员何时调用delete操作。如果没有及时调用delete,会导致内存泄漏。例如:
void testHeap() {
    int* heapVar = new int(20); // 变量heapVar在堆上分配内存,开始其生命周期
    std::cout << *heapVar << std::endl; 
    delete heapVar; // 显式释放堆内存,heapVar生命周期结束
    // std::cout << *heapVar << std::endl; 这里访问heapVar会出错,因为内存已被释放
}

如果在上述代码中没有delete heapVar;这一行,heapVar指向的内存将一直存在,直到程序结束,造成内存泄漏。