【发布时间】:2015-11-20 19:49:44
【问题描述】:
我已阅读帖子:Why do we need to set rvalue reference to null in move constructor?
它说在移动过程中,您只是将指针从一个对象复制到另一个对象,因此两个指针指向临时对象。当临时对象超出范围时,它的析构函数将运行。然后由 2 个指针指向的对象将被释放。所以move构造函数构造的object的指针域会指向不可用的地方。
不过,看看下面的代码:
int *p = new int(3);
int *q = p;
delete p;
std::cout << *q << std::endl;
删除指针p后,指针q仍然可以访问int对象。
那么,是不是因为对象被右值引用访问的时候会造成差异?
【问题讨论】:
-
@zenith 抱歉,只是一个错误。我已经重新编辑了
-
@sydridgm 您在这段代码中究竟在哪里看到右值引用和移动构造?也许选择你自己的标题。
-
@LogicStuff 我发布的代码只是一个测试。无来源
-
您复制了一个指针值,然后删除了底层对象。指针 q 的后续取消引用导致未定义的行为。据我所知,您还没有使用 std::move() ...
-
您的代码已损坏,但如果您想查看一个可能的问题,请尝试致电
delete q;。如果你很幸运,它会崩溃并显示一个很好的错误消息。