gpt4 book ai didi

c++ - 什么时候将 unique_ptr 与 STL 容器一起使用才有意义? (C++11)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:35 24 4
gpt4 key购买 nike

unique_ptr 的容器似乎没有什么意义:你不能将它与初始化列表一起使用,而且我无法遍历容器(下面的解决方法)。我误会了什么吗?或者什么时候使用 unique_ptr 有意义和 STL 容器?

#include <memory>
#include <vector>

using namespace std;

struct Base { void go() { } virtual ~Base() { } };
// virtual ~Base() = default; gives
// "declared virtual cannot be defaulted in the class body" why?

class Derived : public Base { };

int main() {

//vector<unique_ptr<Base>> v1 = { new Derived, new Derived, new Derived };
//vector<shared_ptr<Base>> v2 = { new Derived, new Derived, new Derived };
vector<Base*> v3 = { new Derived, new Derived, new Derived };
vector<shared_ptr<Base>> v4(v3.begin(), v3.end());
vector<unique_ptr<Base>> v5(v3.begin(), v3.end());

for (auto i : v5) { // works with v4
i->go();
}
return 0;
}


以下问题帮助我找到了这些解决方法:

最佳答案

for (auto i : v5) {
i->go();
}

应该是

for (auto& i : v5) { // note 'auto&'
i->go();
}

否则您将尝试复制当前元素。

此外,您不能使用这样的初始化列表,因为 std::unique_ptr 的构造函数和 std::shared_ptr标记为 explicit .你需要做这样的事情:

#include <iterator> // make_move_iterator, begin, end

template<class T>
std::unique_ptr<T> make_unique(){ // naive implementation
return std::unique_ptr<T>(new T());
}

std::unique_ptr<Base> v1_init_arr[] = {
make_unique<Derived>(), make_unique<Derived>(), make_unique<Derived>()
};

// these two are only for clarity
auto first = std::make_move_iterator(std::begin(v1_init_arr));
auto last = std::make_move_iterator(std::end(v1_init_arr));
std::vector<std::unique_ptr<Base>> v1(first, last);

std::vector<std::shared_ptr<Base>> v2 = {
std::make_shared<Derived>(),
std::make_shared<Derived>(),
std::make_shared<Derived>()
};

这是一件好事™,因为否则您可能会泄漏内存(如果后面的构造函数之一抛出异常,则前面的构造函数尚未绑定(bind)到智能指针)。 unique_ptr 的脚尖是必要的,因为初始化列表复制它们的参数,并且自 unique_ptr s 不可复制,你会遇到问题。


也就是说,我使用 std::map<std::string, std::unique_ptr<LoaderBase>>用于我的一个项目中的加载程序字典。

关于c++ - 什么时候将 unique_ptr 与 STL 容器一起使用才有意义? (C++11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com