2013-04-05 4 views
0

Я хочу, чтобы вектор удерживал указатели на некоторые объекты, которыми он будет владеть.Удаление ресурсов, управляемых вектором

Здесь вектор:

private: std::vector<fppVirtual*> m_fapps;

Я создал элементы, как это:

m_fapps.push_back(new fpp1(renderingEngine)); //fpp* are subclasses of fppVirtual 
    m_fapps.push_back(new fpp2(renderingEngine)); 
    m_fapps.push_back(new fpp3(renderingEngine)); 

Как m_fapps переменная вектор экземпляра в другом классе, я хочу, чтобы убедиться, что класс деструктор надлежащим образом очищается m_fapps:

 for (int i=0, size=m_fapps.size();i<size;++i){ 
     delete m_fapps[i]; 
     } 

Является ли это приемлемой техникой управления памятью? Я предполагаю, что этот цикл необходим, поскольку, когда вектор выходит за пределы области, когда его собственный класс разрушен, удаляются только указатели на эти объекты new, правильно?

+0

Как объявляется ваш вектор? –

+3

Да. Но загляните в 'std :: unique_ptr' вместо этого. – Yuushi

+0

@KirilKirov обновленный вопрос – johnbakers

ответ

2

Поскольку никто не дал вам прямого ответа еще - да, это приемлемо, и это единственный способ освободить эту память, имея это объявление vector.

Этого можно и следует избегать, используя интеллектуальные указатели, как предлагал @OliCharlesworth, или используя какой-либо другой контейнер, который был побит @ BjörnPollex.

+0

Благодарим за предоставление ответа на вопрос. – johnbakers

1

Вместо этого вы должны использовать boost::ptr_vector. Интерфейс один и тот же, но он управляет памятью для вас. See this question для некоторых рекомендаций относительно того, следует ли использовать ptr_vector или vector<shared_ptr<>>.

+2

Или 'vector >', что, вероятно, является лучшим выбором по умолчанию, поскольку в коде OP нет указания на совместное владение. – juanchopanza

+0

Правильно, я все еще застрял на C++ 03. –

3

Это работает (с несколькими оговорками), но не считается идиоматическим C++, не зря.

Следует избегать использования вектора интеллектуальных указателей (или интеллектуального вектора, такого как boost::ptr_vector), чтобы избежать необходимости ручного управления памятью.

Это также предоставит вам бесплатную защиту от исключительных ситуаций, а также позволит избежать неприятных проблем с владением, возникающих, если ваш внешний класс будет скопирован.

+0

Я склонен согласиться с другим предложением, что 'vector >' естественным образом подходит для этого, если у меня нет другой причины включить boost в мой проект. – johnbakers

+1

@SebbyJohanns: как только вы заглянете в Boost немного больше, Я уверен, что вы найдете множество причин, чтобы включить его в свой проект. –

+0

@SebbyJohanns: конечно, теперь в стандартной библиотеке есть несколько типов интеллектуальных указателей, выберите тот, который лучше всего подходит для вашего прецедента. –

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