对于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)
从向量中擦除元素时,将其后的每个元素(使用赋值运算符)复制到向量中的上一个点.一旦完成,矢量中的最后一个元素就被破坏了.这可能就是为什么你看到你的最后一个元素被破坏了.使用STL时的第一条规则是确保对象的复制语义正确.
您应该考虑编写赋值运算符:
Category & operator =(const Category & other);
Run Code Online (Sandbox Code Playgroud)
虽然这可能不像听起来那么简单,但考虑对象将在向量中多次复制和破坏.
| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |