2015-03-25 2 views
0

Мне нужен массив размером n, который имеет общие указатели, и каждый из них указывает на один элемент структуры. Что такое синтаксис?Массив общих указателей, которые указывают на элементы структуры, какой синтаксис?

это просто

shared_ptr<Struct_name> array(new Struct_name(n)); 

или что-то еще?

Должен ли я использовать массив C++ (#include array) вместо массива C?

А как насчет освобождения памяти, когда больше нет необходимости в массиве? обрабатывать ли смарт-указатели его для массивов также, или я должен удалить каждый элемент массива на

delete array[i] 
+0

Вы хотите, чтобы объекты делились жизнью или нет? Является ли размер массива определяемым во время компиляции или времени выполнения? Кому принадлежит указатель на массив (в отличие от элементов) и что они могут с ним сделать? Как клиенты запрашивают элемент массива? – Yakk

ответ

2

Вот относительно несложный вариант того, что вы просите:

struct S {}; 
std::array<std::shared_ptr<S>, N> arr; 
std::generate(arr.begin(), arr.end(), []() { return std::make_shared<S>(); }); 

Если N не постоянный, тогда я бы просто рекомендовал использовать std::vector<T>.

struct S {}; 
std::vector<std::shared_ptr<S>> vec(n); 
std::generate(vec.begin(), vec.end(), []() { return std::make_shared<S>(); }); 

Наконец, вся точка за умным указателем - позволить объекту автоматически удалять резервную память. В общем, вам не нужно явно удалять память, управляемую интеллектуальным указателем.

+0

Спасибо за ответ! Почему нужен 'std :: generate'? Может ли он быть заменен, например, 'arr = std :: make_shared (N)'? – Masza

+0

@ Masza: Нет, не может. Основная причина заключается в том, что строка, которую вы предлагаете, не будет компилироваться. 'std :: make_shared ' имеет тип 'shared_ptr ', а 'arr' - тип' std :: array , N> '. –

+0

Хорошо. Какие значения имеют элементы массива после этого? Являются ли «nullptr» или что-то еще? – Masza

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