这是使用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
因move
而被{{1}}摧毁。看起来我没有正确理解。有人可以带我了解正在发生的事情吗? (g ++ 4.7.0)
答案 0 :(得分:3)
您看到的是未定义的行为,由上次调用up->bar()
引起。如果你尝试,它可能是相同的:
static_cast<Foo*>(0)->bar();
请注意,未定义的行为实际上意味着未定义,因此它可能会崩溃或完全出乎意料,就像看起来工作正常一样。编译器还可以理解最后一行代码永远不会到达(在已定义的行为下),并决定生成一个空的可执行文件,它根本不执行任何操作。
答案 1 :(得分:3)
根据我的理解,由于
up
,v
应该被move
销毁。
它被摧毁了。为什么"Dtor called"
出现在输出上呢?析构函数执行时会销毁一个对象。没有其他魔法发生。
我期待调用bar()失败
当行为未定义时,你不能指望任何事情,这是取消引用空unique_ptr
的情况。