Ali*_*Ali 6 c++ stl coding-style unique-ptr c++11
一个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;
}
Run Code Online (Sandbox Code Playgroud)
Xeo*_*Xeo 15
for (auto i : v5) {
i->go();
}
Run Code Online (Sandbox Code Playgroud)
应该
for (auto& i : v5) { // note 'auto&'
i->go();
}
Run Code Online (Sandbox Code Playgroud)
否则,您将尝试复制当前元素.
此外,您不能使用这样的初始化列表,因为标记的构造函数std::unique_ptr和.你需要做这样的事情:std::shared_ptrexplicit
#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>()
};
Run Code Online (Sandbox Code Playgroud)
这是一个Good Thing™,因为否则你可能会泄漏内存(如果后面的一个构造函数抛出,前者还没有绑定到智能指针).这unique_ptr是必要的,因为初始化列表复制了他们的参数,并且因为unique_ptrs不可复制,所以你会遇到问题.
也就是说,我std::map<std::string, std::unique_ptr<LoaderBase>>在我的一个项目中使用了一个加载器字典.
| 归档时间: |
|
| 查看次数: |
5658 次 |
| 最近记录: |