我的问题是:我是否可以保证编译器不会在括号中的块完成后从堆栈中清除变量?
我有这个片段:
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
指向悬空的内存。