Как мне создать универсальный деструктор std :: vector? - PullRequest
4 голосов
/ 29 октября 2008

Наличие вектора, содержащего указатели на объекты, и затем использование функции clear не вызывает деструкторы для объектов в векторе. Я сделал функцию, чтобы сделать это вручную, но я не знаю, как сделать это универсальной функцией для любого типа объектов, которые могут быть в векторе.

void buttonVectorCleanup(vector<Button *> dVector){
    Button* tmpClass;
    for(int i = 0; i < (int)dVector.size(); i++){
        tmpClass = dVector[i];

        delete tmpClass;
    }
}

У меня есть эта функция, которая отлично работает для определенного типа объекта в векторе, но я бы хотел одну функцию, которая могла бы принимать любой тип вектора с указателями на объект.

Ответы [ 4 ]

8 голосов
/ 29 октября 2008

Возможно, вы захотите использовать контейнер указателя boost Они очень эффективны и безопасны.

6 голосов
/ 29 октября 2008

Лучше всего использовать умные указатели, такие как Boost . Тогда объекты будут удалены автоматически.

Или вы можете сделать шаблон функции

template <class T>
void vectorCleanup(vector<T *>& dVector){
    T* tmpClass;
    for(vector<T*>::size_type i = 0; i < dVector.size(); i++){
        tmpClass = dVector[i];

        delete tmpClass;
    }

}

2 голосов
/ 29 октября 2008

Я использую специальный функтор, чтобы удалить указатель и установить его в NULL:

struct delete_ptr
{
    template <typename T>
    void operator()(T& p)
    {
        delete p;
        p = 0;
    }
};

Используется с std::for_each (также не забудьте #include <algorithm>):

int wmain(int, wchar_t*[])
{
    std::vector<int*> items;
    items.push_back(new int(1));
    items.push_back(new int(2));
    items.push_back(new int(3));
    std::for_each(items.begin(), items.end(), delete_ptr());
};
2 голосов
/ 29 октября 2008

Пара других моментов - вы, вероятно, хотите передать ссылку на вектор, а не копию. tmpClass не нужен - вы можете удалить указатель напрямую. Вы должны либо изменить размер вектора до 0, либо заменить указатели на NULL после удаления, иначе вы можете получить доступ к нераспределенной памяти в вызывающей функции.

...