Ну да, прыткий какой, открыл Америку
Это все замечательно только тогда, когда точно знаешь на каком компиляторе собираешь, вот например visual studio 6,7.0 - буит тебе exception сразу, на гцц древнем таже фигня.
Ну, и пара примеров по теме "А знаете ли Вы что...":
Удаление вектора указателей на POD типы без написания функтора:
Код: Выделить всё
for_each( v.begin(), v.end(), ptr_fun(operator delete) );
Тоже самое, но удаление указателей на любые типы, причем с исправленной ситуацией о ub:
Код: Выделить всё
struct DeleteObject
{
template<typename T>
void operator()(const T* ptr) const
{
(void)sizeof(T);
delete ptr;
}
};
...
for_each( v.begin(), v.end(), DeleteObject() );
Или еще более кошерно, при примеру Струструпа:
Код: Выделить всё
struct delete_object
{
template<typename T>
T* operator()(T *ptr) const
{
delete ptr;
return 0;
}
};
...
std::vector<foo*> v;
std::transform(v.begin(), v.end(), v.begin(), delete_object());
т.е. в итоге ты не только удалил все элементы но и обнулил все значения в векторе - проще отловить обращение по нулевому указателю
В если по уму: то надо конечно юзать для такого boost::shared_ptr и не парить себе мозги, если позваляют требования к зависимостям проекта конечно...