![](/img/trans.png)
[英]When exactly does the destruction of a temporary object happen in a function call?
[英]Why does the second destruction of the temporary object on the code below occurs before the message “End of f” is printed?
(下面的代碼)
#include<iostream>
struct C { C() { std::cout << "C()\n"; } ~C() { std::cout << "~C()\n"; } };
void f() {
C * pc = new C;
using C2 = C;
pc->C::~C2(); // OK, destroys *pc
C().C::~C(); // undefined behavior: temporary of type C destroyed twice
std::cout << "End of f\n";
}
int main(){
f();
}
打印以下內容:
C()
~C()
C()
~C()
~C()
End of f
我了解代碼具有未定義的行為,但是 AFAICT,臨時 object 的第二次破壞僅在打印消息“End of f”之后發生。 這里到底發生了什么?
首先,即使你從標准中復制了它,它仍然是未定義的行為,所以答案可能只是編譯器覺得它。
但是,我理解您的問題是為什么在第二個~C()
之后打印End of f
而不是在 scope 的末尾(即打印之后)。
答案是表達式中的臨時變量在結束時被銷毀。 由於C()
創建了一個臨時的,它將在;
處被銷毀。 .
你有矛盾。 您的標題說第二次破壞發生在End
消息打印之前,但您的問題文本說它發生在之后。 但是從您的實際日志 output 可以清楚地看出,它應該在之前發生。
在語句C().C::~C();
, C()
創建一個臨時的 object。 臨時 object 在創建它的表達式的末尾被銷毀。 因此,臨時退出 scope 並在;
. 您在臨時退出 scope 之前顯式調用析構函數,然后編譯器在臨時退出 scope 時隱式調用析構函數。 這就是為什么你會得到 2 次破壞。 都在打印End
消息之前。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.