c++ - 有人可以解释这个 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<Foo>> v;
  v.push_back(move(up));
 }

 up->bar();
 return 0;
}

运行的输出是:

Ctor called
Dtor called
bar called

我原以为对 bar() 的调用会失败,因为据我所知,up 应该被 v 销毁,因为移动ing。看来我没有理解正确。有人可以引导我了解正在发生的事情吗? (g++ 4.7.0)

最佳答案

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

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

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

关于c++ - 有人可以解释这个 unique_ptr 代码发生了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11167374/

相关文章:

c++ - 此类运算符的名称是什么 : '+=' , '-='

c++ - OpenCV WebAssembly

c++ - 在 VS1012 中使用 std::move 将 std::unique_ptr 发送到 std::thread

c++ - 如何使用带有 future<T> vector 的基于范围的 for 循环

python - 尝试在 for 循环之外使用变量会出现 SyntaxError : no binding for nonlocal 'max_' found

php - 检查方法的访问修饰符

javascript - 如何从 cloudinary React 小部件访问全局范围

c++ - 项目配置与 PropertyGroup (MSBuild)

visual-studio - 如何引用 .cpp 文件而不将它们包含在 Visual Studio 的解决方案中?

c++ - 比较两个 C++ 迭代器的性能成本