C++;堆栈与堆和指针 我学习C++(来自java后台)。我想我理解了内存在高层次上的工作原理(堆栈与堆和指针)。为了进行实验,我编写了以下两个玩具函数: int* pntrToHeap(int val) { return new int(val); }

C++;堆栈与堆和指针 我学习C++(来自java后台)。我想我理解了内存在高层次上的工作原理(堆栈与堆和指针)。为了进行实验,我编写了以下两个玩具函数: int* pntrToHeap(int val) { return new int(val); },c++,pointers,memory,C++,Pointers,Memory,及 起初我认为pntrToStack不起作用,因为局部变量val位于堆栈上,在函数退出后被“删除”。但是,在以下代码正常工作(但是有1条警告)后,我重新考虑: int main() { int val1 = *pntrToHeap(3); int val2 = *pntrToStack(4); cout << val1 << endl; cout << val2 << endl; return 0; }

起初我认为pntrToStack不起作用,因为局部变量val位于堆栈上,在函数退出后被“删除”。但是,在以下代码正常工作(但是有1条警告)后,我重新考虑:

 int main()
{
    int val1 = *pntrToHeap(3);
    int val2 = *pntrToStack(4);
    cout << val1 << endl;
    cout << val2 << endl;
    return 0;
}
intmain()
{
int val1=*pntrToHeap(3);
int val2=*pntrToStack(4);

cout肯定是第一个!如果你想在堆栈帧过期后有东西生存,你应该堆分配它


是的,pntrToStack返回的指针指向的值将在下次分配新堆栈帧(即调用函数)时被覆盖。当退出某个范围时,内存不会被擦除。它只是标记为可以自由分配。

那么pntrToStack是未定义的行为吗?@Jonas,我明白你的意思。我可以保留它ThankspNTRTOCHEAP本质上与“new”做的事情完全相同它堆分配一个对象并返回引用。@vsoftco,谢谢。但是悬空指针似乎起作用。我取消了它的引用并得到了正确的值。这是在这种情况下碰巧起作用的事情之一,但可能并不总是这样吗?@DarthB
delete&val2
是错误的,它将编译,但不会按照您的想法执行。
val2
不是动态分配的,因此编译器将释放其内存(尝试手动执行会导致UB)。函数
pntrToStack
不正常,因为它返回一个指向局部变量的指针。哦,我刚才删除了关于val2的部分问题,因为我认为我的前提是错误的,但你说它将被覆盖?我以为val2会在堆栈中保留最初值的副本。对不起,我以为我看到了指针。是的,val2将是一个副本,但如果函数的预期用途是生成指向值的指针,则您也在误用函数
 int main()
{
    int val1 = *pntrToHeap(3);
    int val2 = *pntrToStack(4);
    cout << val1 << endl;
    cout << val2 << endl;
    return 0;
}