【发布时间】:2019-11-08 19:19:46
【问题描述】:
我有一个 Outer 类,其中包含一个 Inner 成员并拥有一个由 unique_ptr 元素组成的向量:
using Elements = std::vector<std::unique_ptr<Element>>;
class Outer
{
void call()
{
_inner.aMethod(_vec);
}
Inner _inner;
Elements _vec; // This should remain the owner of each Element
};
Inner 接收到 unique_ptr 元素的向量并将所有权转移给它自己的向量类成员:
class Inner
{
public:
Inner() = default;
~Inner() = default;
void aMethod(Elements& vec)
{
_vec = std::move(vec);
}
private:
Elements _vec; // This is a vector of unique_ptr but I don't want this class to own the memory
};
我愚蠢地使用了std::move(),因为否则编译器会抱怨我试图在每个向量元素上调用一个已删除的函数(可能是复制构造函数)。
我有一个非法的内存访问,我相信这是因为两个类都认为他们拥有向量元素,并且一个类试图删除一个已经删除的 Element。
我如何让Outer 拥有内存并将元素传递给Inner 以使用(不获取所有权)?
【问题讨论】:
-
std::unique_ptr 不能以任何方式复制。如果它被移动,则所有权被传递。请改用 shared_ptr。
-
Inner 可以在外层而不是它自己的副本中存储指向向量的引用或(原始)指针。 (假设所有 Inner 实例都归 Outer 所有,这似乎没有风险。当然,要小心复制 Outer 对象...
标签: c++ c++11 move smart-pointers unique-ptr