嵌套的unique_ptr和stl容器

时间:2014-02-17 13:48:21

标签: c++ c++11 smart-pointers unique-ptr

我最近读过RAII并已开始使用它。我试图将图形定义为邻接列表,并使用unique_ptr在堆上分配整个DS。我知道我可以将它们定义为堆栈对象,但我正在尝试使用unique_ptr来习惯它们。

我正在做以下

unique_ptr to vector  --
                       |-->(unique_ptr)list<edge>
                       |-->(unique_ptr)list<edge>
                       |-->(unique_ptr)list<edge>
                       |-->(unique_ptr)list<edge>

代码:

#include<memory>
#include<vector>
#include<list>
using namespace std;

struct edge {
    int vertex;
    int weight;
};
int vertices = 10;
unique_ptr<vector<unique_ptr<list<struct edge > > > >
    adj_list(new vector<list<struct edge> >(10)); // THIS COMPILES

unique_ptr<vector<unique_ptr<list<struct edge > > > >
    adj_list(new vector<list<struct edge> >(10, new list<edge>())); //THIS GIVES COMPILATION ERROR

任何人都可以帮我纠正这个吗?

编辑:

我怀疑矢量是RAII类。 如果我做以下

vector<int> *v;
v = new vector<int> (10);

我是否必须删除变量v。或者它会在超出范围时自动释放堆上的内存吗?

编辑: 使用指针向量使用户负责内存管理。

2 个答案:

答案 0 :(得分:4)

您的unique_ptr是不必要的。只需使用对象本身:

vector<list<edge>> adj_list;

RAII并不意味着智能指针,反之亦然。 C ++在智能指针之前很久就适应了RAII。

答案 1 :(得分:2)

查看vector的构造函数here。它们都不接受指向元素的指针。因此,要么使用vector<list<struct edge>*>,要么将调用更改为:

list<struct edge> emptyList;
... (new vector<list<struct edge> >(10, emptyList));