Memory Leak QList<*>::begin()

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
adziu24
Beiträge: 7
Registriert: 3. November 2013 10:40

Memory Leak QList<*>::begin()

Beitrag 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?
Zuletzt geändert von adziu24 am 6. November 2013 22:09, insgesamt 2-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Memory Leak QList<*>::begin()

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
adziu24
Beiträge: 7
Registriert: 3. November 2013 10:40

Re: Memory Leak QList<*>::begin()

Beitrag 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);
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Memory Leak QList<*>::begin()

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
adziu24
Beiträge: 7
Registriert: 3. November 2013 10:40

Re: Memory Leak QList<*>::begin()

Beitrag 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)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Memory Leak QList<*>::begin()

Beitrag von Christian81 »

Ein Interface benötigt immer einen virtuellen dtor damit auch der dtor der abgeleiteten Klasse aufgerufen wird.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
adziu24
Beiträge: 7
Registriert: 3. November 2013 10:40

Re: Memory Leak QList<*>::begin()

Beitrag von adziu24 »

und wie?!

Beispiel (kurz und knapp):

class InterfaceTier {
virtual ~InterfaceTier() {}
};

class Hund : public InterfaceTier
virtual ~Hund();

class Katze : public InterfaceTier
virtual ~Katze()
Zuletzt geändert von adziu24 am 7. November 2013 21:51, insgesamt 4-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Memory Leak QList<*>::begin()

Beitrag von Christian81 »

class InterfaceTier {
virtual ~InterfaceTier() {}
};
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
adziu24
Beiträge: 7
Registriert: 3. November 2013 10:40

Re: Memory Leak QList<*>::begin()

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Memory Leak QList<*>::begin()

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Memory Leak QList<*>::begin()

Beitrag 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 ...
Antworten