我的问题是:我是否可以保证编译器不会在括号中的块完成后从堆栈中清除变量?

我有这个片段:

void someMethod() {
    Bar* barPtr;
    if (foo != null) {
        Bar bar = { foo->a, foo->b };  // (a)
        barPtr = &bar;
    }
    else {
        barPtr = nullptr;
    }

    Bar bar2 = { 42, 4711 }; // (c)
    doSomethingElse(&bar2);

    doSomething(barPtr); // (b)
}


注意,bar仅在上面的块(a)中有效,而barPtr在整个方法中均有效。在(b)处bar不在范围内。


此时使用barPtr是否保存?
还是允许编译器为存储(c)中定义的其他局部变量重用存储的bar内存?

最佳答案

您问:


  是否可以保证在用方括号括起来的块之后不会清除堆栈?


保证是相反的。有保证的是,在用括号括起来的块之后,将清除堆栈,以免破坏自动变量。

Bar* barPtr;
if (foo != null) {
    Bar bar = { foo->a, foo->b };  // (a)
    barPtr = &bar;

   // bar is destructed after the block ends.
}


在该块的末尾,barPtr指向悬空的内存。

10-07 12:07