无法复制到nullptr的unique_ptr

时间:2018-10-20 22:42:59

标签: c++ vector null unique-ptr

看起来好像是将unique_ptr的嵌套向量创建为空抛出试图引用已删除的函数。我相信这是因为它正在尝试复制向量unique_ptr(nullptr),而unique_ptr(nullptr)是不可复制的。

#include <memory>
#include <vector>
struct Foo {
};
int main() {
    std::vector<std::vector<std::unique_ptr<Foo>>> foo(5, std::vector<std::unique_ptr<Foo>>(5));
}

https://onlinegdb.com/SkvGkVYoQ

我不确定如何继续。我只需要一个多维数组的nullptr数组,如果它们是唯一的,那会很不错-除了解决此问题外,不需要shared_ptr。

2 个答案:

答案 0 :(得分:4)

std::unique_ptr完全不可复制。这与nullptr无关。最简单的解决方法是只使用一个维数组并映射维。

然后您可以执行以下操作:

for (std::size_t j = 0; i < 5; ++j) {
    for (std::size_t i = 0; i < 5; ++i) {
        std::size_t index = j*5+i;
        foo.emplace_back(std::make_unique<Foo>());
    }
}

(您可以对嵌套的std::vector应用类似的模式,但是这样无论如何在缓存局部性方面还是更好的。)

答案 1 :(得分:0)

如果由于矢量中每个嵌套的矢量元素的大小不同而需要嵌套多个矢量,则可以使用std::move将唯一的ptrs从一个矢量移动到另一个矢量。

    std::vector<std::unique_ptr<Foo>> container1;
    std::vector<std::unique_ptr<Foo>> container2;
    for (int i = 0; i < 10; ++i)
    {
        container1.emplace_back(std::make_unique<Foo>());
    }

    for (int i = 0; i < 2; ++i)
    {
        container2.emplace_back(std::make_unique<Foo>());
    }

    std::vector<std::vector<std::unique_ptr<Foo>>> containers;
    containers.emplace_back(std::move(container1));
    containers.emplace_back(std::move(container2));

    return 0;

映射是最快的解决方案。