C ++ shared_ptr持有动态分配的数组

时间:2013-06-29 22:07:23

标签: c++ boost stl shared-ptr

我写了一个代表非图形图的简单类。我想有一个私有类成员 - 指向动态分配的数组的指针。数组中的每个集合表示与顶点相邻的顶点以及相应的数组索引号。还有两个构造函数:一个采用数组大小​​(顶点计数)作为参数,第二个 - 从文件中读取它。 我想使用boost :: shared_ptr来管理分配的内存。 Boost文档说:

  

从Boost版本1.53开始,shared_ptr可用于保存   指向动态分配的数组的指针

我创建了一个类成员和两个构造函数:

boost::shared_ptr<std::set<int>[]> adj;
...
Graph(unsigned int vertices);
Graph(std::ifstream& inputStream); // read 

如何初始化我的shared_ptr,对于第一个构造函数我使用初始化列表:

Graph::Graph(unsigned int vertices)
        :adj(new std::set<int>[vertices]),
        vertexCount(vertices){
}

是否正确处理动态分配的数组初始化的shared_ptr? 当我在第二个构造函数体内收到它的大小时,如何初始化shared_ptr?

Graph::Graph(std::ifstream& inputStream){
        inputStream >> std::dec >> vertexCount; // read vertex count from file
        // how to init shared_ptr with vertexCount array size?            
        }

我可以做得更好吗?

2 个答案:

答案 0 :(得分:2)

您对阵列的共享指针看起来不错。在最后一个构造函数中,您可以使用shared_ptr的构造函数或make_shared函数(http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/make_shared.html)将值赋给adj:

adj = boost::shared_ptr<std::set<int>[]>(new std::set<int>[vertexCount]);
//or
adj = boost::make_shared(new std::set<int>[vertexCount]);

就像你使用普通指针一样。

答案 1 :(得分:2)

由于您使用的是boost,因此可以考虑boost::shared_array

boost::shared_array<std::set<int>> set_array;

或者,由于boost 1.53,boost::shared_ptr了解动态分配的数组:

boost::shared_ptr<std::set<int>[]> set_array(new std::set<int>(N));