如何创建通用的std :: vector析构函数?

时间:2008-10-29 01:19:40

标签: c++ stl vector destructor

使用包含指向对象的指针的向量然后使用clear函数不会为向量中的对象调用析构函数。我做了一个手动执行此操作的函数,但我不知道如何使它成为可能在向量中的任何类型对象的泛型函数。

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

        delete tmpClass;
    }
}

这是我的函数,它适用于向量中特定类型的对象,但我想要一个可以使用任何类型的向量和对象指针的函数。

4 个答案:

答案 0 :(得分:8)

您可能想要使用boost pointer containers。它们非常高效和安全。

答案 1 :(得分:6)

最好的办法是使用智能指针,例如来自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 :(得分:2)

其他几点 - 您可能希望传递对向量的引用,而不是副本。不需要tmpClass - 您可以直接删除指针。您应该将向量调整为0或在删除后用NULL替换指针 - 否则您可以在调用函数中访问未分配的内存。

答案 3 :(得分:2)

我使用特殊的仿函数删除指针并将其设置为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());
};