Ich habe ein wirklich seltsames Problem mit STL-Vektoren, in denen der falsche Destruktor für das richtige Objekt aufgerufen wird, wenn ich die Löschmethode aufrufen, wenn das Sinn macht.
Mein Code sieht wie folgt aus etwas:
Seltsames Problem mit Vektoren
for(vector<Category>::iterator iter = this->children.begin(); iter != this->children.end(); iter++)
{
if((*iter).item == item)
{
this->children.erase(iter);
return;
}
-------------------------
}
Es ist nur eine einfache Funktion, die das Element in dem Vektor findet, die einen Gegenstand muss gesucht werden, und aus dem Vektorelement, das entfernt werden. Mein Problem ist, als wenn die Löschfunktion aufgerufen wird und somit das Objekt, auf das der Iterator zeigt, zerstört wird, wird der falsche Destruktor aufgerufen. Genauer gesagt wird der Destruktor des letzten Elements im Vektor aufgerufen und nicht das tatsächliche Objekt, das entfernt wird. So wird der Speicher vom falschen Objekt entfernt, das immer noch ein Element im Vektor sein wird, und das tatsächliche Objekt, das aus dem Vektor entfernt wird, hat immer noch seinen gesamten Speicher intakt.
Die costructor des Objekts sieht wie folgt aus:
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;
}
Und die destructor
Category::~Category()
{
this->children.clear();
if(this->item != NULL)
{
QTreeWidgetItem* parent = this->item->parent();
if(parent != NULL) parent->removeChild(this->item);
delete this->item;
}
}
Wie sieht Ihr Kopierzuweisungsoperator aus? –
Ein funktionierendes minimales Beispiel wäre so viel willkommener. – karlphillip
Ich habe keinen Copy Assigment Operator, ich benutze ihn nicht wirklich. –