Garbage - Beispiele?



  • Hallo Leute,

    da meine schöne Server-Applikation 😃 mit 3,4 MB (Arbeitsspeicher/Ressourcen) anfängt und während der Laufzeit immer mehr zunimmt, gehe ich mal davon aus, dass es sich um Garbage handelt. Und C++ hat ja keinen eingebauten Garbage-Collector.

    Es gibt natürlich auch libraries für dieses Problem. Aber ich möchte kein Problem überdecken, sondern vom Grundlegenden an beseitigen.

    Jetzt wollte ich fragen, ob jemand bei der C++ OOP Beispiele kennt, die zu solch einem Problem führen können.

    Es wird zu Anfang(vor der "Serverschleife") zwar extra Speicher allokiert, dieser aber auch am Ende wieder freigegeben. Daran kann es nicht liegen.

    Danke



  • class A {
    private:
        int *x;
        int *y;
    public:
        A() { x = new int; y = new int; }
        ~A() { delete x; delete y; }
    };
    

    Stelle dir vor, das zweite new wirft eine Exception. Was passiert mit dem Speicher von *x ?



  • Meh, schlechtes Beispiel. delete oder Freigaefunktion vergessen.



  • zuckerlie schrieb:

    Hallo Leute,

    da meine schöne Server-Applikation 😃 mit 3,4 MB (Arbeitsspeicher/Ressourcen) anfängt und während der Laufzeit immer mehr zunimmt, gehe ich mal davon aus, dass es sich um Garbage handelt. Und C++ hat ja keinen eingebauten Garbage-Collector.

    Es gibt natürlich auch libraries für dieses Problem. Aber ich möchte kein Problem überdecken, sondern vom Grundlegenden an beseitigen.

    Jetzt wollte ich fragen, ob jemand bei der C++ OOP Beispiele kennt, die zu solch einem Problem führen können.

    Es wird zu Anfang(vor der "Serverschleife") zwar extra Speicher allokiert, dieser aber auch am Ende wieder freigegeben. Daran kann es nicht liegen.

    Danke

    Für alle manuell freizugebenden Ressourcen RAII benutzen, und dabei für jeden Ressourcentypen eine Klasse schreiben, die je genau eine Instanz der jeweiligen Ressource verwaltet. Das reduziert die Wahrscheinlichkeit für solche Lecks auf nahezu 0%.



  • lass mal valgrind durchlaufen. Der wird dir schon deutlich mitteilen, wo schlecht programmiert wurde.



  • Ich glaube, dass diese Exception zu einem Abbruch führt und der Speicher von *x einfach im Raum stehen bleibt und somit nicht gelöscht wird.Speicherleck?!

    Aber ich habe eigentlich selbst keinen manuellen allokierten Speicher, bis auf 2,3 mal - diese werden aber ordnungsgemäß gelöscht.



  • 314159265358979 schrieb:

    Meh, schlechtes Beispiel. delete oder Freigaefunktion vergessen.

    Wo habe ich da delete vergessen?

    zuckerlie schrieb:

    Aber ich habe eigentlich selbst keinen manuellen allokierten Speicher, bis auf 2,3 mal - diese werden aber ordnungsgemäß gelöscht

    Was verstehst du den unter Garbage? Ich hätte da an Speicherleck gedacht.



  • otze schrieb:

    lass mal valgrind durchlaufen. Der wird dir schon deutlich mitteilen, wo schlecht programmiert wurde.

    Jo, valgrind würde ich auch nehmen.

    @TS
    Nimm valgrind



  • pyhax schrieb:

    Wo habe ich da delete vergessen?

    Der TE hat evtl. ein delete oder eine Freigabefunktion vergessen.



  • zuckerlie schrieb:

    Server-Applikation

    Mal aus Interesse: Was macht und wie funktioniert diese Anwendung in etwa? Vielleicht macht dein System da ein paar Optimierungen und da bleibt Speicher hängen oder so.

    (Wenn du überall RAII benutzt werden es wohl keine Speicherlecks sein. Also: Du hast nirgends ein new stehen? (Außer vielleicht in einer selbst geschriebenen make_unique Funktion. ;))



  • Vielleicht beendet sich der Thread (nutzt du Threads?), der den Client bedient, aus irgend einem Grund nicht, nachdem der Client die Verbindung geschlossen hat? Irgendein blockierender Systemcall oder so.


Anmelden zum Antworten