所以我学习C ++(来自Java背景)。我以为我理解了内存在高级别上的运行方式(堆栈与堆和指针)。为了实验,我写了以下两个玩具功能:
int* pntrToHeap(int val) {
return new int(val);
}
和
int* pntrToStack(int val) {
return &val;
}
起初我认为pntrToStack不会起作用,因为局部变量val在堆栈上被删除"功能退出后。但是,在下面的代码没有错误(但有1个警告)后,我重新考虑了一下:
int main()
{
int val1 = *pntrToHeap(3);
int val2 = *pntrToStack(4);
cout << val1 << endl;
cout << val2 << endl;
return 0;
}
3和4都打印在屏幕上。似乎堆栈实际上没有被删除,但CPU只是失去了访问它的局部变量的能力 - 这是正确的吗?如果是这样,在这种情况下,我们应该选择哪种功能?
最后,由于val1是main的局部变量,因此pntToHeap会创建内存泄漏,因为我无法删除它在堆上创建的值吗?
我知道之前有人问过这些概念,但我找不到答案。谢谢!
答案 0 :(得分:1)
绝对是第一个!如果你想在堆栈帧到期后生存一些东西,你应该堆分配它。
是的,从pntrToStack返回的指针指向的值将在下次分配新的堆栈帧时被覆盖,即。叫一个功能。退出示波器后,内存不会被删除。它只是标记为可以自由分配。