私は消去メソッドを呼び出すときに正しいオブジェクトに対して間違ったデストラクタが呼び出されるstlベクトルには本当に奇妙な問題があります。
ベクトルに奇妙な問題があります
for(vector<Category>::iterator iter = this->children.begin(); iter != this->children.end(); iter++)
{
if((*iter).item == item)
{
this->children.erase(iter);
return;
}
-------------------------
}
それが検索されるいくつかのアイテムを持っているベクトルの要素を見つけ、ベクトルからの要素言っ削除し、単純な機能です:
私のコードは次のようになります。私の問題は、イレーズ関数が呼び出され、イテレータが指しているオブジェクトが破棄されているときよりも、間違ったデストラクタが呼び出されていることです。より具体的には、ベクトルの最後の要素のデストラクタが呼び出されており、実際のオブジェクトは削除されていません。したがって、メモリは間違ったオブジェクトから削除されています。これは依然としてベクトルの要素であり、実際のオブジェクトはベクターから削除されますが、それでもメモリは完全に保持されています。あなたは、おそらく標準的なアルゴリズムを使用する必要があります
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;
}
}
コピー代入演算子はどのように見えますか? –
動作している最小の例ははるかに歓迎されるでしょう。 – karlphillip
私はコピーアサイメント演算子を持っていない、私は実際にそれを使用していない。 –