0

これは、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()私が理解したことから、 ingのためにup破壊されることになっていたので、私は呼び出しが失敗することを期待していました。私は正しく理解していないようです。誰かが私に何が起こっているのかを教えてもらえますか?(g ++ 4.7.0)vmove

4

2 に答える 2

3

表示されるのは、最後の呼び出しによって引き起こされた未定義の動作up->bar()です。試してみると、おそらく同じです:

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

undefined の動作は実際にはundefinedを意味することに注意してください。そのため、正常に動作しているように見えるなど、クラッシュしたり、まったく予期しない動作をしたりする可能性があります。コンパイラは、 (定義された動作の下で)コードの最後の行に決して到達しないことを理解し、何もしない空の実行可能ファイルを生成することを決定することもできます。

于 2012-06-23T06:21:59.503 に答える
3

私が理解していることから、 ingのためにup破壊されるはずでした.vmove

それは破壊されました。他になぜ"Dtor called"出力に表示されるのでしょうか? デストラクタが実行されると、オブジェクトは破棄されます。他の魔法は起こりません。

bar() の呼び出しが失敗することを期待していました

空の を逆参照する場合のように、動作が未定義の場合は何も期待できませんunique_ptr

于 2012-06-23T06:25:02.207 に答える