首页 > 解决方案 > std::move 是否使指向 unique_ptr 拥有的东西的原始指针无效?

问题描述

如果我有一个唯一的指针,并且我将指针指向所拥有的东西unique_ptr

auto t = std::make_unique<int>(67);
auto m = t.get();
auto d = std::move(t);
std::cout << *m;

 

我知道在被修改或销毁m之前都是有效的。t但是当我从 , 转移所有权时tm仍然有效。有人可以让我了解这里发生了什么或标准对此有何规定。

标签: c++unique-ptr

解决方案


m是指向 t 拥有的整数的原始指针。auto d = std::move(t);将所有权转移给新的智能指针 d. d 的内部原始指针设置为您的资源的地址,而 t 的原始指针设置为 nullptr。现在由 d 拥有的整数仍然在与以前完全相同的位置。这就是为什么从 t 到该地址的原始指针 m 在移动到 d 后仍然有效。此时 t 与您的整数无关,它只是std::unique_ptr<int>当前未分配的 a 。您的原始指针 m 将保持有效,直到当前拥有的 unique_ptr 实际删除它,例如因为它超​​出范围。


推荐阅读