Универсальное удаление указателей из контейнеров STL.
Автор: CyberZX
Если у вас много контейнеров, в которых содержатся указатели на динамически выделеные объекты, то надо по всей программе вставлять циклы для освобождения памяти, выделеной для этих объектов. Для того что бы облегчить эту задачу и улучшить читабельность кода можно использывать шаблоны, позволяющие заменить циклы одной строкой.
Вот как это выглядит:
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);
25 марта 2006 (Обновление: 11 июня 2009)