2013-03-22 2 views
0

В ниже код mKnownRSList имеет тип:std :: vector Стереть - он автоматически выделяет выделение?

std::vector<RSAddress *> 

где RSAddress класс я написал. Functiop removeItem удаляет предмет из этого векторного списка.

Мой вопрос здесь в том, что после вызова функции стирания в mKnownRSList я должен де-выделить адрес, указанный итератором, возвращаемым std :: remove_if. В настоящее время я явно выдаю вызов удаления на итераторе с дезамеренным именем, названным последним. Считаете ли вы, что этот подход правильный? Благодарю.

void 
ABC::removeItem(RSAddress * rsAddr) 
{ 
    auto last = 
    std::remove_if(mKnownRSList.begin(), 
        mKnownRSList.end(), 
       [rsAddr](RSAddress * o) 
       { 
        return (*o == *rsAddr); 
       }); 

mKnownRSList.erase(last, mKnownRSList.end()); 

delete *last; 
} 

ответ

3

Вы должны удалить, что указывает указатель внутри контейнера первый, а затем удалить/удалить фактический указатель из контейнера.

Что вы здесь делаете, это разыменование итератора, указывающего на то, что больше не существует.

1

Как вы думаете, этот подход является правильным?

Nope. Правильный способ - использовать smart_pointers, например shared_ptr. Если да, то вы должны только erase. как этот

std::vector< std::shared_ptr<RSAddress> > mKnownRSList; 
... 

mKnownRSList.erase(std::remove_if(mKnownRSList.begin(), 
            mKnownRSList.end(), 
            [rsAddr](const std::shared_ptr<RSAddress> & o) 
            { 
             return (*o == *rsAddr); 
            }), 
        mKnownRSList.end() 
); 
+0

Я бы второй borisbn. Это самый безопасный подход. – Arun

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