2010-08-22 15 views
29

ich eine ziemlich komplexe Multi-Threaded-Anwendung habe (Server), dass aufgrund einer Assertion von Zeit zu Zeit zum Absturz:Shared_ptr Assertion px = 0 fehlgeschlagen

/usr/include/boost/smart_ptr/shared_ptr.hpp:418: T* boost::shared_ptr< <template-parameter-1-1> >::operator->() const [with T = msg::Player]: Assertion `px != 0' failed. 

ich nicht in der Lage gewesen, die Ursache zu finden und war frage mich, ob das ein Problem mit boost :: shared_ptr ist oder ich?

Ich versuchte g ++ 4.4.3-4ubuntu5 und llvm-g ++ (GCC) 4.2.1 mit Optimierung und ohne Optimierung und libboost1.40-dev (= 1.40.0-4ubuntu4).

+1

Multithreading Bugs sind schwer zu lokalisieren. Da Sie Linux verwenden, gibt es keinen Grund, Valgrind nicht zu verwenden - es hilft Ihnen, den Fehler sehr zu finden. – nos

+0

Ich benutze Valgrind ausgiebig und ich bekomme Null Fehler (mit memcheck), bis die Bestätigung auftritt. Ich lerne immer noch, wie man drd Fehlermeldungen interpretiert, da die meisten von ihnen (Konflikt laden/speichern auf booleschen/Integer-Typen) kein Problem scheinen. – Horacio

Antwort

33

Es sollte kein Problem bei der Verwendung von boost::shared_ptr geben, solange Sie die freigegebenen Zeiger korrekt initialisieren und den gleichen Speicherverwaltungskontext für alle freigegebenen Objektbibliotheken verwenden.

In Ihrem Fall versuchen Sie, einen nicht initialisierten gemeinsamen Zeiger zu verwenden.

boost::shared_ptr<Obj> obj; 
obj->Something(); // assertion failed 

boost::shared_ptr<Obj> obj(new Obj); 
obj->Something(); // ok 

Ich würde empfehlen, sie direkt bei der Deklaration wann immer möglich zu initialisieren. Die Ausnahmebehandlung kann eine Menge von "unsichtbaren" Pfaden für die Ausführung des Codes erzeugen, und es kann sehr schwierig sein, die nicht initialisierten gemeinsamen Zeiger zu identifizieren.

PS: Es gibt andere Probleme, wenn Sie Module laden/entladen, in denen shared_ptr verwendet werden, was zu Chaos führt. Dies ist sehr schwer zu lösen, aber in diesem Fall hätten Sie einen Zeiger ungleich null. Dies ist nicht das, was gerade passiert.

3

Sie könnten sicherstellen möchten, dass Sie

immer einen Namen Smart-Pointer-Variablen über das Ergebnis neuer

zu halten, wie es hier empfohlen: boost::shared_ptr - Best Practices

Grüße, Jonny

Verwandte Themen