Войти
ПрограммированиеПодсказкиОбщее

Универсальное удаление указателей из контейнеров STL.

Автор:

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

Вот как это выглядит:

template <typename T>
struct  DeleteObj : public std::unary_function<T, void>
{
  void  operator()(T ptr) const
  {
    delete  ptr;
  }
};

template <class Container>
void DeleteSTLObj(Container &obj)
{
  std::for_each(obj.begin(),obj.end(),DeleteObj<Container::value_type>());
}

template <typename K, typename T>
inline  void  DeleteSTLObj(std::map<K, T> &obj)
{
  std::map<K,T>::iterator  iter, end = obj.end();
  for (iter = obj.begin(); iter != end; ++iter)
    delete  iter->second;

}

А вот пример использывания:

   vector<SomeObject*>  objects;
    objects.push_back(new object);
    objects.push_back(new object);
    objects.push_back(new object);
    objects.push_back(new object);
    objects.push_back(new object);

    //  работаем с вектором
    ...  

    //  удаляем выделенную память
    DeleteSTLObj(objects);

#C++, #STL, #контейнеры

25 марта 2006 (Обновление: 11 июня 2009)