4

拥有一个包含指向对象的指针的向量,然后使用 clear 函数不会调用向量中对象的析构函数。我创建了一个函数来手动执行此操作,但我不知道如何将其作为向量中可能存在的任何类型对象的通用函数。

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

        delete tmpClass;
    }
}

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

4

4 回答 4

8

您可能想使用 boost 的指针容器。它们高效且安全。

于 2008-10-29T02:03:25.520 回答
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;
    }

}

于 2008-10-29T01:24:38.547 回答
2

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

于 2008-10-29T01:35:38.040 回答
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());
};
于 2008-10-29T07:24:28.727 回答