有人可以解释这个unique_ptr代码发生了什么吗?

时间:2012-06-23 06:16:55

标签: c++ c++11 scope unique-ptr

这是使用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()失败,因为根据我的理解,upvmove而被{{1}}摧毁。看起来我没有正确理解。有人可以带我了解正在发生的事情吗? (g ++ 4.7.0)

2 个答案:

答案 0 :(得分:3)

您看到的是未定义的行为,由上次调用up->bar()引起。如果你尝试,它可能是相同的:

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

请注意,未定义的行为实际上意味着未定义,因此它可能会崩溃或完全出乎意料,就像看起来工作正常一样。编译器还可以理解最后一行代码永远不会到达(在已定义的行为下),并决定生成一个空的可执行文件,它根本不执行任何操作。

答案 1 :(得分:3)

  

根据我的理解,由于upv应该被move销毁。

它被摧毁了。为什么"Dtor called"出现在输出上呢?析构函数执行时会销毁一个对象。没有其他魔法发生。

  

我期待调用bar()失败

当行为未定义时,你不能指望任何事情,这是取消引用空unique_ptr的情况。