从堆栈上分配的对象指针向量中删除元素

时间:2012-12-22 03:32:05

标签: c++ vector destructor

我有一个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);
}

我的问题是我是否还需要为对象调用析构函数,还是由删除处理?

3 个答案:

答案 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大约一半。