gpt4 book ai didi

c++ - vector 的奇怪问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:46:49 27 4
gpt4 key购买 nike

我有一个关于 STL vector 的非常奇怪的问题,当我调用 erase 方法时,为正确的对象调用了错误的析构函数,如果这有意义的话。
我的代码看起来像这样:

 for(vector<Category>::iterator iter = this->children.begin(); iter != this->children.end(); iter++)
{
if((*iter).item == item)
{
this->children.erase(iter);
return;
}
-------------------------
}

这只是一个简单的函数,它在 vector 中找到具有要搜索的项目的元素,并从 vector 中删除该元素。我的问题是当调用删除函数时,迭代器指向的对象被销毁,调用了错误的析构函数。更具体地说,调用 vector 中最后一个元素的析构函数,而不是被删除的实际对象的析构函数。因此内存从错误的对象中移除,它仍然是 vector 中的一个元素,而从 vector 中移除的实际对象仍然拥有完整的内存。
对象的构造函数如下所示:

Category::Category(const Category &from)
{
this->name = from.name;
for(vector<Category>::const_iterator iter = from.children.begin(); iter != from.children.end(); iter++)
this->children.push_back((*iter));

this->item = new QTreeWidgetItem;
}

和析构函数

Category::~Category()
{
this->children.clear();
if(this->item != NULL)
{
QTreeWidgetItem* parent = this->item->parent();
if(parent != NULL) parent->removeChild(this->item);
delete this->item;
}
}

最佳答案

当您从 vector 中删除元素时,它之后的每个元素都会被复制(使用赋值运算符)到 vector 中的前一个位置。完成后, vector 中的最后一个元素将被破坏。这可能就是您看到最后一个元素被破坏的原因。使用 STL 时的第一条规则是确保对象的复制语义正确。

你应该考虑写一个赋值运算符:

Category & operator =(const Category & other);

虽然这可能不像听起来那么简单,但考虑到对象会在 vector 中被多次复制和销毁。

关于c++ - vector 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4682482/

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