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

Can someone explain what is happening with this unique_ptr code?

本文关键字:unique ptr 什么 发生了 代码 一下 解释      更新时间:2023-10-16
这是一个

使用unique_ptr的代码:

struct Foo{
  Foo(){std::cout << "Ctor calledn";}
  ~Foo(){std::cout << "Dtor calledn";}
  void bar(){std::cout << "bar calledn";}
}
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应该因为move而被v摧毁。看来我还没有正确理解。有人可以带我了解正在发生的事情吗?(g++ 4.7.0)

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

static_cast<Foo*>(0)->bar();
请注意,未定义

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

据我所知,up应该因为move而被v摧毁。

它被摧毁了。否则为什么"Dtor called"会显示在输出上?当析构函数执行时,对象将被销毁。没有其他魔法发生。

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

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