Seite 1 von 1
Memory Leak QList<*>::begin()
Verfasst: 6. November 2013 17:58
von adziu24
Wie der Title bereits verrät hab ich an der besagten Stelle Schwierigkeiten den Leak wegzubekommen ...
Code: Alles auswählen
bool Haus::has(const InterfaceZimmer& zimmer)
{
bool has = false;
QList<InterfaceZimmer*>::const_iterator i;
for (i = _zimmer.begin(); <========================== da Problem laut Compiler
i != _zimmer.end() && !has;
++i)
{
if ((*i)->equals(zimmer))
{
has = true;
}
}
return has;
}
Code: Alles auswählen
Member von Haus: QList<InterfaceZimmer*> _zimmer;
Member von [class Zimmer: public InterfaceZimmer] QString name
Eine fast identische Methode aus einer anderen Klasse, welche sich nur beim "if ((*i)->equals(zimmer))"
unterscheidet bereitet mir dieses Leak Problem nicht

Hat jemand vielleicht eine Idee voran es liegen könnte?
Re: Memory Leak QList<*>::begin()
Verfasst: 6. November 2013 21:23
von Christian81
Wie ist die genauer Fehlermeldung? Und was hat eine Compilerwarnung/Fehlermeldung mit einem Memory-Leak zu tun?
Und btw: Wenn Du schon einen const_iterator benutzt, solltest du auch constBegin()/constEnd() benutzen.
Re: Memory Leak QList<*>::begin()
Verfasst: 6. November 2013 22:09
von adziu24
ich kann diese fehlermeldung grad nicht reproduzieren dafür eine andere,
die vielleicht auch damit zu tun hat:
Memory leak laut Valgrind:
5: Haus::addZimmer(InterfaceZimmer*) in blubbla
4: QList<InterfaceZimmer*>::append(InterfaceZimmer* const&) in /user/include/qt4/QtCore/qlist.h:497
3: QList<InterfaceZimmer*>::detach_helper_grow(int, int) in /user/include/qt4/QtCore/qlist.h:666
zu folgender methode
Code: Alles auswählen
void Haus::addZimmer(InterfaceZimmer *zimmer)
{
_zimmer.append(zimmer);
}
Re: Memory Leak QList<*>::begin()
Verfasst: 7. November 2013 06:20
von Christian81
Wenn Du _zimmer nicht mehr leerst bzw. einfach ein clear() machst ohne die Pointer darin zu löschen ist es ein Leak, aber das sind C++ Grundlagen - einen Pointer den man dynamisch anlegt sollte man auch wieder löschen
Re: Memory Leak QList<*>::begin()
Verfasst: 7. November 2013 14:07
von adziu24
qDeleteAll(_zimmer);
_zimmer.clear();
steht im destructor und im assignment operator => C++ Grundlagen wirklich ah sag bloß
Leak ist weg und das stand bei mir in der main:
Mist:
InterfaceHaus *haus = new Haus();
InterfaceZimmer *zimmer = new Zimmer();
haus->addZimmer(zimmer);
delete haus;
Gut:
Haus *haus = new Haus();
InterfaceZimmer *zimmer = new Zimmer();
haus->addZimmer(zimmer);
delete haus;
ich komm grad aus java wieder, was war daran falsch? der destructor in "Mist" wird ja anscheinend nicht aufgerufen
(in der konkreten Klasse ist der destructor natürlich virtual)
muss ich im interface den destructor irgendwie deklarieren, wenn ja wie???
virtual ~InterfaceZimmer() => geht ja nicht, da die Implementierung in einer konkreten Klasse zu: "declaration of ‘~InterfaceZimmer’ as member of ‘Zimmer’" .. führt
alle Mehoden im InterfaceZimmer sind natürlich pure virtual
WIE ZUR VERFICKTEN HÖLLE LÖSCHE ICH EINEN INTERFACE POINTER
( ohne recast!, da dieser sonst an zu vielen stellen erforderlich wird und eigentlich ein anzeichen für eine miserable struktur ist, wovan ich grad nicht ausgehe,
da ich "nur" eine lose kopplung in c++ erreichen möchte Oo)
Re: Memory Leak QList<*>::begin()
Verfasst: 7. November 2013 19:44
von Christian81
Ein Interface benötigt immer einen virtuellen dtor damit auch der dtor der abgeleiteten Klasse aufgerufen wird.
Re: Memory Leak QList<*>::begin()
Verfasst: 7. November 2013 21:27
von adziu24
und wie?!
Beispiel (kurz und knapp):
class InterfaceTier {
virtual ~InterfaceTier() {}
};
class Hund : public InterfaceTier
virtual ~Hund();
class Katze : public InterfaceTier
virtual ~Katze()
Re: Memory Leak QList<*>::begin()
Verfasst: 7. November 2013 21:39
von Christian81
class InterfaceTier {
virtual ~InterfaceTier() {}
};
Re: Memory Leak QList<*>::begin()
Verfasst: 7. November 2013 21:41
von adziu24
Christian81 hat geschrieben:class InterfaceTier {
virtual ~InterfaceTier() {}
};
ja
{} hab ich hier in dem forum vergessen super funktioniert trotzdem nicht
leak nach wie vor ich gebs auf -_-, danke trotzdem ich schlag mir jetz den kopf ein
Re: Memory Leak QList<*>::begin()
Verfasst: 7. November 2013 21:51
von Christian81
Siehe meine Signatur - Funktioniert nicht ist keine Fehlermeldung. Etwas genauer und etwas mehr (volles Beispiel was man auch kompilieren kann) wär schon nicht schlecht. Aber wer nicht will der hat.
Re: Memory Leak QList<*>::begin()
Verfasst: 8. November 2013 11:35
von RHBaum
ich komm grad aus java wieder, was war daran falsch?
Du denkst in Java
"everything is a class, everything iss a reference" solltest wieder ausm Kopf verbannen
warum muss Haus und Zimmer aufm freestore (new) ???
in c++ solltest du new meiden !
Der Ansatz sieht wahrscheinlich wirklich so aus, wie sich nen Java progger c++ vorstellt
Mir gehts grad andersrum, ich schau mir grad Java an, und mir tun die news da echt weh
Ciao ...