Когда временные файлы создаются как часть уничтоженного вызова функции?

Временный файл создается, поскольку часть аргумента вызову функции гарантировала, что осталась вокруг до названных функциональных концов, даже если временный файл не передается непосредственно функции?

Нет фактически никакого шанса, который был когерентным, таким образом, вот пример:

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 шоу это не; вывод:

Созданный (4)
нечто (): 4
Уничтоженный A

Вопрос, поведение GCC гарантируется спецификацией? Или компилятор, позволенный уничтожать временный файл A перед вызовом к foo, делание недопустимое указателя на его участника я использую?

22
задан Michael Mrozek 14 June 2010 в 21:58
поделиться

4 ответа

Временные объекты существуют до конца полного выражения, в котором они созданы.

В вашем примере объект A, созданный A(4), будет существовать по крайней мере до тех пор, пока выражение не закончится сразу после возврата из вызова foo().

Такое поведение гарантируется стандартом языка:

Временные объекты уничтожаются как последний шаг в оценке полного выражения (1.9), которое (лексически) содержит точку, где они были созданы. Это верно, даже если оценка заканчивается выбросом исключения (C++03 §12.2/3).

Время жизни временного объекта может быть продлено путем привязки к нему ссылки (в этом случае время его жизни продлевается до конца времени жизни ссылки), или путем использования его в качестве инициализатора в списке инициализаторов конструктора (в этом случае время его жизни продлевается до полного построения конструируемого объекта).

20
ответ дан 29 November 2019 в 05:29
поделиться

§12.2 / 3: «Временные объекты уничтожаются на последнем этапе оценки полного выражения (1.9), которое (лексически) содержит точку, в которой они были созданы».

IOW , вы в безопасности - объект A нельзя уничтожать до тех пор, пока не вернется foo .

6
ответ дан 29 November 2019 в 05:29
поделиться

Время жизни вашего временного объекта A (4) будет длиться достаточно долго, чтобы вызвать y ()

Память, на которую указывает ответ y () ненадежен, в зависимости от потоков и распределения он может быть перераспределен и значение изменено до того, как вызов foo () использует его.

-2
ответ дан 29 November 2019 в 05:29
поделиться

Временное длится до конца выражения, частью которого оно является - что в данном случае является вызовом функции.

2
ответ дан 29 November 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: