【发布时间】:2011-03-03 17:52:58
【问题描述】:
作为函数调用参数的一部分创建的临时变量是否保证在被调用函数结束之前一直存在,即使临时变量没有直接传递给函数?
几乎没有机会是连贯的,所以这里有一个例子:
class A {
public:
A(int x) : x(x) {printf("Constructed A(%d)\n", x);}
~A() {printf("Destroyed A\n");}
int x;
int* y() {return &x;}
};
void foo(int* bar) {
printf("foo(): %d\n", *bar);
}
int main(int argc, char** argv) {
foo(A(4).y());
}
如果A(4) 直接传递给foo,它肯定不会在foo 调用结束后被销毁,而是我在临时调用一个方法并丢失对它的任何引用。我本能地认为临时的A 会在foo 甚至开始之前被销毁,但是使用 GCC 4.3.4 进行的测试表明它不是;输出是:
构造 A(4)
foo(): 4
破坏A
问题是,规范是否保证 GCC 的行为?还是允许编译器在调用foo 之前销毁临时A,从而使指向我正在使用的成员的指针无效?
【问题讨论】:
标签: c++ memory-management specifications