Если только указатели на объект были в векторе, то вы
утечка памяти, как только вы позвоните remove_if
. remove_if
перемещает
указатели, которые вы удерживаете, но это ничего не говорит о
значения за итератором, который он возвращает. Таким образом, если у вас есть что-то
как [a, b, c, d]
(где a
, b
и т. д. представляют разные указатели),
затем после e = remove_if( v.begin(), v.end(), matches(b) )
ваш
вектор может (и, вероятно, будет) выглядеть как [a, c, d, d]
, с e
указывая на второй d
, и все следы b
потеряны навсегда.
Очевидным решением будет использование shared_ptr
в vector
; этот
будет гарантировать, что любой указатель, который в конечном итоге был удален из vector
будет удален В противном случае вы можете использовать два прохода: первый будет
быть for_each
с чем-то вроде:
struct DeleteIfCondition
{
void operator()( ObjectType* &ptr ) const
{
if ( condition( *ptr ) ) {
ObjectType* tmp = ptr;
ptr = NULL;
delete tmp;
}
}
};
std::for_each( v.begin(), v.end(), DeleteIfCondition() );
как функциональный объект, затем:
v.erase( std::remove( v.begin(), v.end(), NULL ), v.end() );