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()失败,因为据我所知,应该会因为ingup而被破坏。看来我没有正确理解。有人可以带我了解正在发生的事情吗?(g++ 4.7.0)vmove

4

2 回答 2

3

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

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

请注意,未定义的行为实际上意味着未定义,因此它可能会崩溃或做一些完全出乎意料的事情,比如看起来工作正常。编译器还可以理解永远不会到达最后一行代码(在定义的行为下),并决定生成一个什么都不做的空可执行文件。

于 2012-06-23T06:21:59.503 回答
3

据我了解,up应该v因为moveing 而被摧毁。

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

我期待对 bar() 的调用失败

当行为未定义时,您不能期待任何事情,这就是取消引用 empty 的情况unique_ptr

于 2012-06-23T06:25:02.207 回答