[c++] 함수 호출의 일부로 생성 된 임시 변수는 언제 삭제됩니까?


Answers

§12.2 / 3 : "임시 객체는 전체 표현 (1.9)을 평가할 때 마지막 단계에서 (어휘 적으로) 생성 된 시점을 포함하는 것으로 파괴됩니다."

IOW, 당신은 안전합니다. A 객체는 foo 반환 될 때까지 파괴되어서는 안됩니다.

Question

임시 함수가 함수에 직접 전달되지 않아도 호출 된 함수가 끝날 때까지 머물러있는 함수 호출에 대한 인수의 일부로 임시로 생성됩니까?

일관성있는 기회가 거의 없으므로 여기에 예가 있습니다.

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 호출이 끝날 때까지 확실히 파기되지 않을 것이지만, 대신 임시 메서드를 호출하고 그것에 대한 참조를 잃어 버리는 것입니다. 나는 foo 가 시작되기 전에 임시 A 가 파괴 될 것이라고 본능적으로 생각할 것이다. 그러나 GCC 4.3.4로 테스트하는 것은 그렇지 않다는 것을 보여준다. 출력은 다음과 같습니다.

건설 A (4)
foo () : 4
파괴 된 A

문제는 GCC의 동작이 사양에 의해 보장된다는 것입니다 . 또는 컴파일러가 임시 A 를 호출하여 foo 호출하기 전에 destroy 할 수 있습니까? 사용중인 멤버에 대한 포인터를 invalible로 설정 했습니까?




임시 객체 A(4) 의 수명은 y() 를 호출 할만큼 오래 지속됩니다.

y() 가 반환 될 때 가리키는 메모리는 스레딩 및 할당에 따라 신뢰할 수 없으며 재 할당 될 수 있으며 foo() 호출하기 전에 변경된 값이이를 사용합니다.




Links