gpt4 book ai didi

c++ - 删除指针 vector 时遇到问题

转载 作者:太空狗 更新时间:2023-10-29 20:13:59 25 4
gpt4 key购买 nike

我有一个管理器类,其中包含指向虚拟基类的指针 vector ,以允许将各种子类存储在那里。在这个管理器类的析构函数中,我希望它循环遍历它持有的所有指针并将它们删除。然而,我已经尝试了一些我遇到的方法,并且程序在执行过程中不断崩溃。

我目前的代码如下所示:-

for (std::vector<GameState*>::iterator it = gamestates_.begin(); it != gamestates_.end(); ++it){
delete *it;
it = gamestates_.erase(it);
}

我还没有尝试过的一件事是使用 unique_ptr 但我确信这应该能够在不使用它们的情况下处理它。如果我错了,请纠正我。

编辑:我知道我应该在循环后清除 vector ,但这是我在尝试了所有删除指针的常规方法后得出的结果。它似乎不喜欢删除命令。

最佳答案

从 vector 中删除一个元素会使迭代器失效,因此您之后无法继续迭代。在这种情况下,我不会删除循环中的元素;之后我会清除 vector :

for (auto it = gamestates_.begin(); it != gamestates_.end(); ++it){
delete *it;
}
gamestates_.clear();

尽管如此,如果它在析构函数中并且 vector 即将被销毁,那么清除它也没有意义。

如果您确实需要在循环内删除(可能因为您只想删除某些元素),那么您需要多加注意以保持迭代器有效:

for (auto it = gamestates_.begin(); it != gamestates_.end();){ // No ++ here
if (should_erase(it)) {
it = gamestates_.erase(it);
} else {
++it;
}
}

One thing I haven't tried yet is using unique_ptr but I'm sure this should be able to handle it without using them. Please correct me if I'm wrong.

如果您确实想通过此方式通过 Steam 管理动态对象,请确保您遵循 Rule of Three :您需要实现(或删除)复制构造函数和复制赋值运算符,以防止“浅”复制给您留下两个试图删除相同对象的 vector 。您还需要注意在删除或替换它们的任何其他位置删除对象。存储智能指针(或对象本身,如果您不需要多态指针)将为您处理所有这些事情,所以我总是建议这样做。

I'm aware I should clear the vector after the loop but this is what I've come to after trying every normal method of deleting the pointers. It doesn't seem to like the delete command.

最可能的原因是您没有遵循三原则,并且在复制 vector 后不小心尝试删除相同的对象两次。也有可能 GameState 是一个基类,而您忘记给它一个虚拟析构函数,或者指针已被其他代码损坏。

关于c++ - 删除指针 vector 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18574813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com