C ++ Stack vs Heap和Pointers

时间:2015-05-13 11:38:19

标签: c++ pointers memory

所以我学习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会创建内存泄漏,因为我无法删除它在堆上创建的值吗?

我知道之前有人问过这些概念,但我找不到答案。谢谢!

1 个答案:

答案 0 :(得分:1)

绝对是第一个!如果你想在堆栈帧到期后生存一些东西,你应该堆分配它。

是的,从pntrToStack返回的指针指向的值将在下次分配新的堆栈帧时被覆盖,即。叫一个功能。退出示波器后,内存不会被删除。它只是标记为可以自由分配。