【发布时间】:2016-03-04 11:55:24
【问题描述】:
我已经使用 GCC 5.2 (C++11) 测试了以下代码:
#include <iostream>
#include <memory>
struct Foo
{
Foo() { std::cout << "Foo::Foo\n"; }
~Foo() { std::cout << "Foo::~Foo\n"; }
void bar() { std::cout << "Foo::bar\n"; }
};
void f(const Foo &)
{
std::cout << "f(const Foo&)\n";
}
int main()
{
std::unique_ptr<Foo> p1(new Foo); // p1 owns Foo
if (p1) p1->bar();
{
//p1->bar();
std::unique_ptr<Foo> p2(std::move(p1)); // now p2 owns Foo
f(*p2);
p1->bar();
if(p1==nullptr)
{
std::cout<<"NULL"<<std::endl;
}
p1 = std::move(p2); // ownership returns to p1
std::unique_ptr<Foo> p3;
p3->bar();
std::cout << "destroying p2...\n";
}
if (p1) p1->bar();
// Foo instance is destroyed when p1 goes out of scope
}
所以现在我的问题是,虽然 p1 在 move 操作后保证为 nullptr,但它似乎仍然指向前一个对象?
编辑: 是的,我在问为什么 p1->bar();仍然可以工作,因为 p1 已经移动,而 bar() 不是静态函数。 正如每个人都指出的那样,未定义的行为可能导致任何事情发生。 我现在已经遇到了足够多的未定义行为......如果有人能指出我在 C++11 中常见的未定义行为的集合,我将不胜感激。 提前致谢。
【问题讨论】:
-
您的代码有未定义的行为。
-
声明成员函数
virtual,你会更好地改变它的崩溃。然后在附加了调试器的情况下运行你的应用程序并观察std::unique_ptr的内部结构。 -
你能简化一下,让你的实际问题更清楚吗?
-
你在问为什么
p1->bar();在std::unique_ptr<Foo> p2(std::move(p1));之后起作用? -
您期待什么行为?在任何情况下,
Foo::bar总是做同样的事情。
标签: c++ c++11 unique-ptr