gpt4 book ai didi

c++ - 安全删除容器元素

转载 作者:行者123 更新时间:2023-11-28 00:07:50 29 4
gpt4 key购买 nike

您能否建议在以下情况下安全删除 std::vector 的元素:1.清空vector的所有元素;2. 根据条件删除一个元素。

这段代码有什么危险:

    typename std::vector<T*>::iterator it;
for (it=std::vector<T*>::begin();it!=std::vector<T*>::end();it++)
{
if (*it) delete *it;
}

谢谢。

最佳答案

您不会从 vector 中删除元素。因此 vector 元素指向之前的位置,即相同的 T。但是,由于您已经删除了那个 T,您不能再取消引用指针 - 这将是 UB 并可能使您的程序崩溃。

delete 正在调用 T 的析构函数(太好了,这是你应该做的事情)但是 delete 并没有改变 vector 。因此,迭代器始终有效。

要么您应该删除为其调用了 delete 的元素,要么至少将 vector 元素设置为 nullptr。

typename std::vector<T*>::iterator it;
for (it=std::vector<T*>::begin();it!=std::vector<T*>::end();it++)
{
delete *it;
*it = nullptr; // Only needed when you don't erase the vector element
}

该解决方案要求您始终在使用 vector 的任何元素之前检查 nullptr。

然而,在大多数情况下,最好的解决方案是从 vector 中删除元素。

如果您通过对每个元素调用 delete 来销毁所有元素,只需在循环后对 vector 调用 clear

关于c++ - 安全删除容器元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532961/

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