Hi, I have a C++ class that implements a Composite pattern. Relevant code follows:
-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----- class Compound : public Entity { void addChild(const QByteArray& key, Entity* newChild) { Q_D(Compound); Entity*& child = d->m_children[key]; delete child; child = newChild; } ~Compound() { Q_D(Compound); typedef QHash<QByteArray, Entity*>::const_iterator Iterator; Iterator it1 = d->m_children.constBegin(); const Iterator it2 = d->m_children.constEnd(); for (; it1 != it2; ++it1) delete it1.value(); } }; -----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----- If I run valgrind --leak-check=full against some example code instantiating a tree of Compound and Entity instances, it complains about a memleak in the second line of Compound::addChild. It says that QHash::detach_helper allocates a few bytes which are definitely lost. Strange thing is that the ~QHash destructor gets called; the QHash instance is a direct member of CompoundPrivate. And now this: The memleak vanishes (at least from Valgrind's point of view) when I insert d->m_children.clear() at the end of ~Compound. I'm puzzled; what's going on here? BTW the same memleak also occurs with QMap. And while we're on that topic, I have a second question: When designing an API, should I prefer QByteArray or QString as the key for QHash? That key is only used in code and possibly a binary serialization format. I'm unsure whether QString induces a performance hit. Greetings Stefan >> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<