C++ 有人能解释一下这个独特的密码是怎么回事吗?
这是一个使用unique_ptr的代码: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&
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
未定义的行为未定义为显示失败。未定义的行为未定义为显示失败。