Eventuelles Speicherleck



  • Hallo!

    Nachdem ich eine Anwendung unter Linux compiliert habe, musste ich feststellen dass irgendwo kein Speicher freigegeben wird. Ich meine die Stelle ausgemacht zu haben, kann mir aber nicht erklären was syntaktisch jetzt falsch ist:

    / ----------------------------------------------------------------------------
    void SignalGenerator::TransmitMessage(const std::list<const DBG::CMessage*> &CMessageList)
    // ----------------------------------------------------------------------------
    {
    	std::list<const DBG::CMessage*>::const_iterator it = CMessageList.begin();
    	std::list<const DBG::CMessage*>::const_iterator itEnd = CMessageList.end();
    
    	while(it != itEnd)
    	{			
    		// Hier hab ich alles auskommentiert, Speicherleck ist immer noch da
    		delete (*it);  // Hab ich hier einen Denkfehler?
    		++it;
    	}
    
    	// [...]
    }
    

    Deaktivierei ch die Nachrichtenausgabe so wird auch kein neuer Speicher angesprochen. Hier liegt also irgendwo der Fehler 😕



  • Was ist DBG::CMessage? Hat das einen Destruktor? Oder ist gar nur ein typedef für ein Char-Array?



  • MemoryLeak123 schrieb:

    ...musste ich feststellen dass irgendwo kein Speicher freigegeben wird....

    Wie meinst Du das denn, festgestellt zu haben ?
    "ps" o.ä. Tools sind da nicht selten irreführend.
    Wenn natürlich Deine Maschine "lahmgelegt" wird, wäre das schon was Anderes ...

    Ach ja: Nicht selten liegt so ein Fehler darin, dass die umschließende Funktion (hier: SignalGenerator::TransmitMessage()) gar nicht aufgerufen wird. Das klingt banal, aber man kann sich da schon ziemlich fies selbst ein Bein stellen (z.B. mit virtueller Funktion überschrieben).

    Gruß,

    Simon2.



  • @Simon ich merke das daran das mir unter linux angezeigt wird das meine Anwendung immer mehr Speicher braucht. Und irgendwann -> *bum*

    Fellhuhn schrieb:

    Was ist DBG::CMessage? Hat das einen Destruktor? Oder ist gar nur ein typedef für ein Char-Array?

    Ist eine Klasse, ich programmier gleich mal in den dtor eine Ausgabe. Die Frage ist: Ist meine iteratorsyntax mit dem delete so richtig?



  • Sollte so richtig sein.



  • deleter5000 schrieb:

    @Simon ich merke das daran das mir unter linux angezeigt wird das meine Anwendung immer mehr Speicher braucht. ...

    Das war mir schon klar. Meine Frage war, wie Du Dir das ansiehst.

    deleter5000 schrieb:

    ...irgendwann -> *bum*...

    Schon ausprobiert ?

    Hintergrund meiner Frage ist: Moderne Betriebssysteme werfen freigegebenen Speicher oftmals nicht direkt wieder in den "frei-Pool", sondern behalten ihn erstmal belegt (geht schneller für den Fall, dass der Prozess gleich wieder welchen habe will). Er wird dann erst wieder "weitervermittelt", wenn der "frei-Pool" zu klein geworden ist.
    Wirkliche Speicherlecks kann man deswegen nur mit entsprechenden Tools exakt nachweisen ... oder, wenn das OS abschmiert (was darauf hinweist, dass es NICHT der o.g. Effekt ist).
    Vielleicht weißt Du das alles schon, aber ich kann das bei Unregistrierten nicht wissen ... und ehrlich gesagt: Geschätzte 70% (gefühlt 98% 😉 ) der "ich-habe-ein-Speicherleck"-Posts hier sind solche "Schattengefechte".

    Gruß,

    Simon2.



  • Ich bekomme, wenn das Programm eine Nacht durchläuft, einen Segmentation Fault.

    Testweise wird zyklisch immer dieselbe Anzahl an Nachrichten generiert, d.h. er dürfte nicht ständig neuen Speicher allozieren was hier aber der Fall ist.

    😕



  • Probiere doch mal Valgrind. Das Programm läuft dann zwar stinklangsam, aber man bekommt die meistens Speicherlöcher, Bugs direkt angezeigt.



  • Du gibst zwar den Speicher der Zeiger in der Liste frei, aber die Elemente bleiben in der List!?



  • lagalopex schrieb:

    Du gibst zwar den Speicher der Zeiger in der Liste frei, aber die Elemente bleiben in der List!?

    Die muss er ja nicht selber freigeben. Wenn er die Liste nicht mehr braucht,spielt es keine Rolle.



  • Mich wundert nur dass er halt eine Liste mit lauter ungültigen Zeigern behält. Und ich weiß ja auch nicht, ob er die Liste weiterverwendet oder nicht.



  • lagalopex schrieb:

    Mich wundert nur dass er halt eine Liste mit lauter ungültigen Zeigern behält. Und ich weiß ja auch nicht, ob er die Liste weiterverwendet oder nicht.

    Es hat keine Auswirkung auf sein Problem, aber du hast Recht. Unsauber ist es allemal. Zumindest auf 0 setzen sollter er sie,aber am besten ist wirkilch gleich auch aus der Liste zu entfernen (erase).


Anmelden zum Antworten