gpt4 book ai didi

c++ - vector 删除功能删除错误的对象

转载 作者:行者123 更新时间:2023-11-30 04:32:00 25 4
gpt4 key购买 nike

我有一个 vector 声明为:

vector<Curve> workingSet;

Curve 是我创建的一个类,它包含一个字符串“name”和一个由构造函数动态分配的结构数组。

我有一个循环,应该从 vector 中删除 2 个(共 4 个)项目。

vector<Curve>::iterator it = workingSet.begin();

//remove tbi's children from the working set
for ( ; it != workingSet.end();){
if (it->thisName == tbi.childAName ||it->thisName == tbi.childBName)
it= workingSet.erase(it);
else
++it;
}

当调试器到达 .erase(it) 调用时,我可以看到“it”迭代器指向 vector 中的曲线 2。这很好;我想从 vector 中删除曲线 2。

然后我被调试器带到析构函数(我在那里有一个断点),大概应该是破坏曲线 2。但是当我查看“this” watch 时,我可以看到被破坏的曲线是曲线4!析构函数然后根据需要继续“删除[]”对象中的数组,并将数组指针设置为 NULL。

当调试器返回到程序时,完成了 erase() 调用,我可以看到 vector 2 已从数组中删除,而曲线 4 仍然存在。曲线 4 的数组指针仍指向与之前相同的位置,但内存已被释放且数组包含垃圾。

谁能提出为什么曲线 4 被弄乱了?

注意(1) 曲线类有一个复制构造函数,它执行“深”复制。注意(2) 类(class)/项目比我在这里提到的要多

顺便说一句,根据调试器,曲线 2 和 4 中的数组指针指向不同的位置并包含不同的值。

编辑:我现在已经实现了复制分配。现在正确的项似乎从 vector 中删除了,但错误的析构函数仍在被调用!然而,当调试器返回数组时,曲线 4 仍然完好无损。

最佳答案

当从 vector 中删除一个项目时,它后面的所有元素都会移到前面以填充空白空间。如果您的编译器还不支持 move,它是通过复制所有元素来完成的,并且 vector 中的最后一项现在被复制到它之前的项目,是一个重复项并且正在被删除.

至少它应该是这样的。

关于c++ - vector 删除功能删除错误的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7946130/

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