2013-06-29 3 views
1

Я пишу простой класс, представляющий граф без ограничений. Я хотел бы иметь частный член класса - указатель на динамически выделенный массив множеств. Каждый набор в массиве представляет вершины, смежные с вершиной с соответствующим номером индекса массива. Также есть два конструктора: один выбранный размер массива (количество вершин) в качестве параметра, второй - чтение его из файла. Я хочу использовать boost :: shared_ptr для управления выделенной памятью. Подталкивания документация говорит:C++ shared_ptr, содержащий динамически распределенный массив

Начиная с выпуском 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 обработка динамически распределенной инициализации массива? Ang Как инициализировать 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

Ваши общие указатели на массивы выглядят хорошо. В последнем конструкторе вы можете просто присвоить значение прил с помощью конструктора shared_ptr или в make_shared функцию (http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/make_shared.html):

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

так же, как вы могли бы сделать с обычными указателями.

+2

ли этот вызов 'удалить []' в соответствии с требованиями? – juanchopanza

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)); 
+0

Я только что узнал, что shared_ptr узнал массивы. С этим было бы полезно использовать shared_array? –

+0

Работает ли weak_ptr с shared_array? –

+0

Я только что прочитал dox (поскольку сначала я думал, что он не может работать :), это подразумевает полную поддержку, и, думая после того, как с помощью type_traits, их действительно нетрудно объединить. Поскольку make_shared возвращает shared_ptr с типом [], я ожидаю, что он просто узнает сделку без пользовательского удаления. –

Смежные вопросы