我用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
}
Run Code Online (Sandbox Code Playgroud)
所以现在我的问题是,虽然移动操作后p1保证为nullptr,但它似乎仍指向前一个对象?
编辑:是的,我问为什么p1-> bar(); 给定p1已经移动仍然工作,而bar()不是静态函数.正如大家所指出的那样,未定义的行为会导致任何事情发生.我现在遇到了足够的未定义行为......如果有人能指出我在C++ 11中常见的未定义行为的集合,我将不胜感激.提前致谢.
我假设你指的是这个:
std::unique_ptr<Foo> p2(std::move(p1)); // now p2 owns Foo
p1->bar();
Run Code Online (Sandbox Code Playgroud)
并输出"Foo :: bar"?
那么,它应该做什么呢?您正在取消引用无效指针.任何事情都可能发生.
在这种情况下,由于您没有访问不存在的任何成员,因此Foo您很幸运能够在此处崩溃(因为在较低级别,没有实际的"物理"解除引用0x0需求).
但它并没有改变你所做的事情是错误的事实.
| 归档时间: |
|
| 查看次数: |
242 次 |
| 最近记录: |