我有一个Object指针向量。我希望能够删除这些对象并释放这些对象占用的内存。
我现在所拥有的是:
这是包含对象指针的向量:
std::vector<Ball*> List;
这是删除向量中的元素并释放内存的函数:
void BallManager::DeleteBall(int id)
{
List[id]->~Ball(); //Not sure if this is needed
delete List[id];
List[id] = NULL;
List.erase(List.begin()+id);
}
我的问题是我是否还需要为对象调用析构函数,还是由删除处理?
答案 0 :(得分:2)
如果要删除指针元素,delete
将调用对象析构函数。不需要打电话
<{1}}也不需要将指针设置为NULL,因为你要删除元素。
List[id]->~Ball()
强烈建议您使用Chris提到的智能指针,然后当您从STL容器中删除元素时,您不必担心删除对象指针,演示如下:
std::vector<Ball*> List;
void BallManager::DeleteBall(int id)
{
if (id < List.size()) // should check id is still in range
{
delete List[id];
List.erase(List.begin()+id);
}
}
答案 1 :(得分:1)
不,调用delete(而不是dealloc)会自动调用析构函数。
删除元素后,无需将其设置为空,只需擦除即可。
void BallManager::DeleteBall(int id)
{
delete List[id];
List.erase(List.begin()+id);
}
new自动调用构造函数,相应的delete会自动调用析构函数。
答案 2 :(得分:0)
您几乎不必明确调用析构函数。它们通过释放过程调用 - 在动态分配对象的情况下删除。
有关详细信息,请参阅Destructors FAQ大约一半。