C++ 有人能解释一下这个独特的密码是怎么回事吗?

C++ 有人能解释一下这个独特的密码是怎么回事吗?,c++,c++11,scope,unique-ptr,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&

这是一个使用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;
}
我原以为对
bar()
的调用会失败,因为据我所知,
up
应该被
v
破坏,因为
move
ing。看来我没听懂。有人能带我走过正在发生的事情吗?(g++4.7.0)

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

static_cast<Foo*>(0)->bar();
static_cast(0)->bar();
请注意,未定义的行为实际上意味着未定义,因此它可能会崩溃或出现完全出乎意料的情况,比如看起来工作正常。编译器还可以理解最后一行代码永远不会到达(定义的行为不足),并决定生成一个空的可执行文件,该文件什么也不做。

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

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

据我所知,
up
应该被
v
摧毁,因为
移动

它被毁了。为什么输出上会显示
“数据或调用的”
?当析构函数执行时,对象被销毁。没有其他魔法发生

我希望对bar()的调用失败

当行为未定义时,您不能期望任何结果,这就是取消引用空的
unique\u ptr
的情况

据我所知,
up
应该被
v
摧毁,因为
移动

它被毁了。为什么输出上会显示
“数据或调用的”
?当析构函数执行时,对象被销毁。没有其他魔法发生

我希望对bar()的调用失败


当行为未定义时,您不能期望任何结果,例如取消引用空的
unique_ptr

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