加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 无法删除指针向量

发布时间:2020-12-16 09:47:15 所属栏目:百科 来源:网络整理
导读:我有一个管理器类,它包含一个指向虚拟基类的指针向量,允许在那里存储各种子类.在这个管理器类的析构函数中,我希望它循环遍历它所拥有的所有指针并删除它们.但是,我尝试了许多方法,程序在执行过程中不断崩溃. 我现有的代码如下所示: – for (std::vectorGame
我有一个管理器类,它包含一个指向虚拟基类的指针向量,允许在那里存储各种子类.在这个管理器类的析构函数中,我希望它循环遍历它所拥有的所有指针并删除它们.但是,我尝试了许多方法,程序在执行过程中不断崩溃.

我现有的代码如下所示: –

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

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.

如果你确实希望通过蒸汽管理动态对象,那么请确保你遵循Rule of Three:你需要实现(或删除)复制构造函数和复制赋值运算符,以防止“浅”复制让你有两个向量试图删除相同的对象.您还需要注意删除删除或替换它们的任何其他位置的对象.存储智能指针(或者对象本身,如果你不需要多态性的指针)将为你处理所有这些事情,所以我总是建议这样做.

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.

最可能的原因是您没有遵循三规则,并且在复制矢量后意外地尝试删除两次相同的对象. GameState也可能是一个基类,你忘了给它一个虚拟析构函数,或者指针已经被其他代码破坏了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读