面试题答案
一键面试栈内存管理与变量生命周期
- 确定方式:栈上的局部变量生命周期从变量声明处开始,到其所在代码块结束时结束。当进入一个函数或代码块时,系统会在栈上为局部变量分配内存空间,当离开该函数或代码块时,栈上为这些局部变量分配的空间会自动被释放。
- 受影响因素:主要受代码块作用域影响。若在函数内部嵌套代码块,局部变量在嵌套代码块内有效,离开嵌套代码块即失效。例如:
void testStack() {
{
int localVar = 10; // 变量localVar在这个内部代码块开始其生命周期
std::cout << localVar << std::endl;
} // 离开这个内部代码块,localVar生命周期结束,内存被自动回收
// std::cout << localVar << std::endl; 这里访问localVar会报错,因为它已不存在
}
堆内存管理与变量生命周期
- 确定方式:通过
new
运算符在堆上分配的变量,其生命周期从new
表达式执行时开始,直到使用delete
运算符显式释放该内存时结束。 - 受影响因素:依赖于程序员何时调用
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
指向的内存将一直存在,直到程序结束,造成内存泄漏。