簡體   English   中英

為什么下面代碼中臨時 object 的第二次銷毀發生在“End of f”消息打印之前?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM