【问题标题】:Can someone explain what is happening with this unique_ptr code?有人可以解释这个 unique_ptr 代码发生了什么吗?
【发布时间】:2012-06-23 06:16:54
【问题描述】:

这是一个使用 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() 的调用失败,因为据我了解,up 应该被v 破坏,因为moveing。看来我没有正确理解。有人可以带我了解正在发生的事情吗? (g++ 4.7.0)

【问题讨论】:

  • 未定义的行为未定义为显示失败。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    当行为未定义时,您不能期待任何事情,例如取消引用空的 unique_ptr

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 2015-10-16
      • 1970-01-01
      • 2020-05-02
      • 2021-05-26
      • 2020-11-03
      相关资源
      最近更新 更多