使用包含指向对象的指针的向量然后使用clear函数不会为向量中的对象调用析构函数。我做了一个手动执行此操作的函数,但我不知道如何使它成为可能在向量中的任何类型对象的泛型函数。
void buttonVectorCleanup(vector<Button *> dVector){
Button* tmpClass;
for(int i = 0; i < (int)dVector.size(); i++){
tmpClass = dVector[i];
delete tmpClass;
}
}
这是我的函数,它适用于向量中特定类型的对象,但我想要一个可以使用任何类型的向量和对象指针的函数。
答案 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());
};