Удаление вектора указателей

Мне нужно создать указатели на экземпляры класса, и программа не знает во время компиляции, сколько указателей я создам. Для удаления я рассматривал возможность хранения указателей в векторе, а затем удаления их один за другим. Будет ли использование смарт-указателей более чистым способом ? И если кто-то не хочет использовать умные указатели, будет ли это использование вектора считаться чистым ?

минимальный код:

#include <vector>
using namespace std;

class Foo {
public:
    Foo();
};
Foo::Foo(){}
void createFooVector(int nb, std::vector<Foo*> &v){
    for(int i=0;i<nb;i++){
        Foo* f = new Foo();
        v.push_back(f);
    }
}
int main(int argc, char *argv[]){
    std::vector<Foo*> v;
    createFooVector(5,v); 
    while (!v.empty()){
        Foo* f = v.back();
        v.pop_back();
        delete f;
    }
}

4 ответов


Я бы предложил либо использовать boost:: pointer_vector, an std::vector<std::unique_ptr<Foo>>, или раскрутить свой собственный Foo класс менеджера, который содержит vector<Foo*> и заботится об удалении в конструкторе (вы должны видеть это как "экспертное" решение и пытаться это сделать, только если вы полностью понимаете безопасность исключений). Вы не хотите делать удаление вручную, что может легко привести к ошибкам.


ваш код в порядке. Однако использование интеллектуальных указателей должно быть предпочтительным выбором (меньше кода для записи и гораздо меньше возможностей для ошибок памяти).


будет использовать смарт-указатели уборщицей идти ?

да.

и если один не хочет использовать смарт-указатели, будет ли это использование вектор считать чистым ?

у меня нет идей, почему кто-то не хочет использовать смарт-указатели в C++, если это не домашнее задание... Но, я думаю, лучше использовать что-то вроде boost::pointer_containers в этом случае.


Если вы не используете классы, производные от Foo и Foo относительно недорого скопировать конструкцию, просто используйте vector<Foo>.

Если ваш компилятор поддерживает семантику перемещения, проблемы не должно быть.