C ++ statische Klassen und shared_ptr Speicherlecks

7

Ich kann nicht verstehen, warum der folgende Code Speicherlecks erzeugt (ich verwende boost::shared_ptr mit einer statischen Klasseninstanz). Könnte mir jemand helfen?

%Vor%     
Yippie-Ki-Yay 01.06.2010, 09:38
quelle

3 Antworten

8

Bei einer Schätzung meldet die CRT ein falsches positives Ergebnis - der folgende Code zeigt, dass der gemeinsame Zeiger korrekt funktioniert, zumindest mit g ++

%Vor%

Es druckt:

%Vor%     
anon 01.06.2010, 09:51
quelle
11

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:

  1. Lakos, J, 1996, großes C ++ - Softwaredesign. Abschnitt 7.8.1.3, Addison Wesley, Reading, Massachusetts.
  2. Meyers, S, 2005, Effektiv C ++, dritte Ausgabe. Punkt 4: Stellen Sie sicher, dass Objekte initialisiert werden bevor sie benutzt werden. Addison Wesley, Reading, Massachusetts.
  3. Stroustrup, B, 2000, Die C ++ Programmiersprache Special Edition. Abschnitt 10.4.9, Addison Wesley, Reading, Massachusetts.
Michael Mueller 08.11.2012 00:53
quelle
8

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.

    
sharptooth 01.06.2010 09:41
quelle

Tags und Links