Ich kann nicht verstehen, warum der folgende Code Speicherlecks erzeugt (ich verwende boost::shared_ptr
mit einer statischen Klasseninstanz). Könnte mir jemand helfen?
Dies ist ein Speicherleck. Sie initialisieren eine statische Instanz von myclass namens myclass_instance. Sie initialisieren auch "shared_ptr myclass :: ptr".
Nach Stroustrup [3] werden Statiken in der Reihenfolge initialisiert, in der sie definiert sind. Daher haben Sie die statische Definition von myclass_instance, die das interne ptr auf Konstruktion initialisiert. Sie haben dann jedoch die Definition der statischen myclass :: ptr, die den Standardkonstruktor für shared_ptr aufruft.
Dies ist ein Beispiel für das klassische Statik-Bestellproblem. Der Compiler denkt, dass myclass :: ptr nicht wirklich initialisiert wurde, so dass das ursprüngliche shared_ptr nicht zerstört wird. Stattdessen ist es nur geleakt.
Sie brauchen irgendeinen bloßen Zeiger. Wenn Sie C ++ 11 verwenden, können Sie die Nifty Counter Technique mit einer ternären Zuweisungsanweisung ausführen, die zu sich selbst geht, wenn Sie feststellen, dass das Objekt bereits initialisiert wurde. Es ist ziemlich grob, aber es funktioniert.
So würde ich es in C ++ 11 machen:
%Vor%Weitere Informationen finden Sie in den folgenden Abschnitten:
Wahrscheinlich wird das Leck erkannt, bevor die globalen Objekte zerstört werden und shared_ptr
hat eine Chance, das Objekt freizugeben, daher ist es wahrscheinlich ein falsches Leck.
Tags und Links memory-leaks c++ shared-ptr