向量的奇怪问题

Col*_*tru 2 c++ qt stl vector

对于stl向量我有一个非常奇怪的问题,当我调用擦除方法时,如果有任何意义,则会为正确的对象调用错误的析构函数.
我的代码看起来像这样:

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

它只是一个简单的函数,它在向量中找到要搜索的项目的元素,并从向量中移除所述元素.我的问题是,当调用erase函数时,迭代器指向的对象被破坏,正在调用错误的析构函数.更具体地说,正在调用向量中最后一个元素的析构函数,而不是被删除的实际对象的析构函数.因此,内存将从错误的对象中移除,该对象仍将是向量中的元素,并且从向量中移除的实际对象仍然保持其所有内存的完整性.
对象的costructor如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

和析构函数

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

Jar*_*edC 5

从向量中擦除元素时,将其后的每个元素(使用赋值运算符)复制到向量中的上一个点.一旦完成,矢量中的最后一个元素就被破坏了.这可能就是为什么你看到你的最后一个元素被破坏了.使用STL时的第一条规则是确保对象的复制语义正确.

您应该考虑编写赋值运算符:

Category & operator =(const Category & other);
Run Code Online (Sandbox Code Playgroud)

虽然这可能不像听起来那么简单,但考虑对象将在向量中多次复制和破坏.