1

我有一个对象指针向量。我希望能够删除这些对象并释放这些对象占用的内存。

我目前拥有的是这样的:

这是包含对象指针的向量:

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);
}

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

4

3 回答 3

2

如果要删除指针元素,delete会调用对象析构函数。无需调用 List[id]->~Ball()也无需将指针设置为 NULL,因为无论如何您都将擦除该元素。

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);
    }
}

强烈建议您使用 Chris 提到的智能指针,那么当您从 STL 容器中删除元素时,您无需担心删除对象指针,演示如下:

  std::vector<std::shared_ptr<Ball> > List;
  void BallManager::DeleteBall(int id) 
  {
     if (id < List.size())   // should check id is still in range
     {  
        List.erase(List.begin()+id);
     }
  }
于 2012-12-22T04:17:31.593 回答
1

不,调用 delete(而不是 dealloc)会自动调用析构函数。

删除元素后,也不需要设置为null,删除即可。

void BallManager::DeleteBall(int id) 
{
    delete List[id];
    List.erase(List.begin()+id);
}

new 自动调用构造函数,对应的 delete 自动调用析构函数。

于 2012-12-22T03:36:15.530 回答
0

您几乎不必显式调用析构函数。它们是通过释放过程调用的——在动态分配对象的情况下删除。

有关更多详细信息,请参阅大约一半的析构函数常见问题解答。

于 2012-12-22T03:35:10.527 回答