簡體   English   中英

有人可以解釋一下這個unique_ptr代碼發生了什么嗎?

[英]Can someone explain what is happening with this unique_ptr code?

這是使用unique_ptr的代碼:

struct Foo{
  Foo(){std::cout << "Ctor called\n";}
  ~Foo(){std::cout << "Dtor called\n";}
  void bar(){std::cout << "bar called\n";}
}

int main(){
 unique_ptr<Foo> up(new Foo);
 {
  vector<unique_ptr<Foo>> v;
  v.push_back(move(up));
 }

 up->bar();
 return 0;
}

運行的輸出為:

Ctor called
Dtor called
bar called

我原以為對bar()的調用會失敗,因為據我所知,由於moveup應該被v破壞。 看來我沒有正確理解。 有人可以引導我了解正在發生的事情嗎? (g ++ 4.7.0)

您看到的是未定義的行為 ,由上一次調用up->bar() 如果嘗試以下操作,則可能是相同的:

static_cast<Foo*>(0)->bar();

請注意, 未定義的行為實際上意味着undefined ,因此它可能崩潰或發生某種完全出乎意料的事情,例如看起來正常工作。 編譯器還可以理解,將永遠不會到達最后一行代碼(在已定義的行為下) ,並決定生成一個完全不執行任何操作的空可執行文件。

據我了解,由於moveup應該被v破壞。

它被摧毀了。 為什么在輸出上"Dtor called"顯示"Dtor called" 執行析構函數時將銷毀對象。 沒有其他魔術發生。

我期望對bar()的調用失敗

當行為未定義時,您不能指望任何事情,這是取消引用空的unique_ptr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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