C++ 删除指向抽象类的指针向量

C++ 删除指向抽象类的指针向量,c++,memory,vector,std,C++,Memory,Vector,Std,我有一个抽象的类实体。在游戏循环中,我使用指向实体的指针的std::vector,这样我就可以创建在游戏期间动态扩展实体的类对象。 我想避免内存泄漏,所以我想释放向量占用的内存 这够了吗 GameLoop::~GameLoop() { int n = entities.size(); for (int i = 0; i < n; i++) entities.pop_back(); } GameLoop::~GameLoop(){ int n=entitie

我有一个抽象的类实体。在游戏循环中,我使用指向实体的指针的std::vector,这样我就可以创建在游戏期间动态扩展实体的类对象。 我想避免内存泄漏,所以我想释放向量占用的内存

这够了吗

GameLoop::~GameLoop() {
    int n = entities.size();
    for (int i = 0; i < n; i++)
        entities.pop_back();
}
GameLoop::~GameLoop(){
int n=entities.size();
对于(int i=0;i
实体是什么

std::vector<Entity*> entities
std::向量实体
用于(int i=0;i
一种更短更快的方法是
entities.clear()

假设
实体
是一个成员,甚至不需要清除它:对象将立即被销毁,其成员将被销毁,vector将自动清除其元素

但是请注意,如果向量中的指针拥有指向的对象,那么您确实会泄漏内存,因为指针将不再存在,因此无法删除以前拥有的对象

要使拥有的指针释放由
new
进行的动态分配,必须
删除该指针。不过,您不应该使用拥有裸体poitner(除非您正在实现一个循环回自身的链表)。改用智能指针和RAII容器


另外,通过指向base的指针删除对象的行为是未定义的,除非base的析构函数是虚拟的

任何你
新建的
,你都需要
删除
,但在可能的情况下更喜欢自动存储或智能指针。不幸的是,只有你才能知道这是否“足够”。如果这些对象仍然在其他地方被引用,这将不起作用,因为这将留下悬空指针。如果这些对象还拥有其他一些动态作用域对象,并且它们的析构函数没有删除它们,那么这也不够。为了确定显示的代码是否“足够”,您需要完全了解整个应用程序是如何使用这些对象的,它们何时被构造,何时不再在任何地方使用。您可能需要使用
std::unique\u ptr
for (int i = 0; i < n; i++)
    entities.pop_back();