c – 无法删除指针向量
我有一个管理器类,它包含一个指向虚拟基类的指针向量,允许在那里存储各种子类.在这个管理器类的析构函数中,我希望它循环遍历它所拥有的所有指针并删除它们.但是,我尝试了许多方法,程序在执行过程中不断崩溃.
我现有的代码如下所示: – for (std::vector<GameState*>::iterator it = gamestates_.begin(); it != gamestates_.end(); ++it){ delete *it; it = gamestates_.erase(it); } 我还没有尝试过的一件事是使用unique_ptr,但我确信这应该能够在不使用它们的情况下处理它.如果我错了,请纠正我. 编辑:我知道我应该在循环之后清除向量,但这是我在尝试删除指针的每个常规方法后所得到的.它似乎不喜欢删除命令. 解决方法
从向量中删除元素会使迭代器无效,因此您无法继续迭代.在这种情况下,我不会擦除循环中的元素;之后我会清除矢量:
for (auto it = gamestates_.begin(); it != gamestates_.end(); ++it){ delete *it; } gamestates_.clear(); 虽然,如果这是在析构函数中并且矢量即将被销毁,那么也没有必要清除它. 如果你确实需要在循环中擦除(也许是因为你只想删除一些元素),那么你需要更加小心以保持迭代器有效: for (auto it = gamestates_.begin(); it != gamestates_.end();){ // No ++ here if (should_erase(it)) { it = gamestates_.erase(it); } else { ++it; } }
如果你确实希望通过蒸汽管理动态对象,那么请确保你遵循Rule of Three:你需要实现(或删除)复制构造函数和复制赋值运算符,以防止“浅”复制让你有两个向量试图删除相同的对象.您还需要注意删除删除或替换它们的任何其他位置的对象.存储智能指针(或者对象本身,如果你不需要多态性的指针)将为你处理所有这些事情,所以我总是建议这样做.
最可能的原因是您没有遵循三规则,并且在复制矢量后意外地尝试删除两次相同的对象. GameState也可能是一个基类,你忘了给它一个虚拟析构函数,或者指针已经被其他代码破坏了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |