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 持有动态分配的数组的主要内容,如果未能解决你的问题,请参考以下文章

C++智能指针之shared_ptr与右值引用(详细)

C++智能指针之shared_ptr与右值引用(详细)

C++智能指针之shared_ptr与右值引用(详细)

每帧动态分配一个 shared_ptr 中的图像

c++11智能指针(一) shared_ptr

C++智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr