[英]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()
的調用會失敗,因為據我所知,由於move
而up
應該被v
破壞。 看來我沒有正確理解。 有人可以引導我了解正在發生的事情嗎? (g ++ 4.7.0)
您看到的是未定義的行為 ,由上一次調用up->bar()
。 如果嘗試以下操作,則可能是相同的:
static_cast<Foo*>(0)->bar();
請注意, 未定義的行為實際上意味着undefined ,因此它可能崩潰或發生某種完全出乎意料的事情,例如看起來正常工作。 編譯器還可以理解,將永遠不會到達最后一行代碼(在已定義的行為下) ,並決定生成一個完全不執行任何操作的空可執行文件。
據我了解,由於
move
,up
應該被v
破壞。
它被摧毀了。 為什么在輸出上"Dtor called"
顯示"Dtor called"
? 執行析構函數時將銷毀對象。 沒有其他魔術發生。
我期望對bar()的調用失敗
當行為未定義時,您不能指望任何事情,這是取消引用空的unique_ptr
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.