C++ shared_ptr 持有动态分配的数组
Posted
技术标签:
【中文标题】C++ shared_ptr 持有动态分配的数组【英文标题】:C++ shared_ptr holding dynamically allocated array 【发布时间】:2013-06-27 10:22:25 【问题描述】:我写了一个简单的类来表示无向图。我想要一个私有类成员 - 指向动态分配的集合数组的指针。数组中的每个集合表示与具有相应数组索引号的顶点相邻的顶点。还有两个构造函数:一个将数组大小(顶点数)作为参数,第二个 - 从文件中读取它。 我想使用 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?
我可以做得更好吗?
【问题讨论】:
【参考方案1】:由于您使用的是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));
【讨论】:
我刚刚了解到 shared_ptr 学习了数组。这样一来,使用 shared_array 有什么好处? 我刚刚阅读了 dox (起初我认为它不能工作:),它意味着完全支持,并且在事后思考 type_traits 真的不难将它们联合起来。由于 make_shared 返回 shared_ptr with [] 类型,我希望它只知道没有自定义删除器的交易。 @BalogPal 是的,我也检查过,在这方面它的行为似乎与std::shared_ptr
的行为完全不同。我正在删除它。【参考方案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]);
就像你对普通指针所做的那样。
【讨论】:
这个会根据需要拨打delete[]
吗?以上是关于C++ shared_ptr 持有动态分配的数组的主要内容,如果未能解决你的问题,请参考以下文章