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

标签 c++ vector stdvector

我有一个 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/

相关文章:

c++ - C++ 20 [[no_unique_address]]在GCC中的错误?

vector - 将多个向量连接成一个新向量的最佳方法是什么?

c++ - 使用包含结构的 Vector 的指针问题

c++ - 错误 : ‘result’ does not name a type

C++ 和标准容器 : memory addresses of members

c++ - 将对象函数转换为函数指针

c++ - 关于原生 C++ 开发的现代书籍

c++ - 引用 CMFCToolbar 自定义教程?

c++ - g++ ld 找不到 x86_64 架构的 RInside 符号

c++ - 为 std::vector 键入安全索引值