Frage

Gibt es irgendwelche Tipps / Tricks für zyklische Referenzen von shared_ptr ist zu finden?

Dies ist ein exmaple von dem, was ich zu finden bin versucht -. Leider kann ich nicht die Schleife in meinem Code zu finden scheinen

struct A
{
  boost::shared_ptr<C> anC;
};

struct B
{
  boost::shared_ptr<A> anA;
};

struct C
{
  boost::shared_ptr<B> anB;
};
War es hilfreich?

Lösung 4

Ich habe eine Kombination der oben genannten Stellen. Ich benutzte einen Speicher-Profiler, kam mit einigen vermutet Zyklen und brachen die von weak_ptr die verwendet wird.

Ich habe das vor in CRT Erkennung von Speicherlecks gebaut verwendet, aber leider in meinem Fall gibt es mehrere statische Singletons, die bis zum Modul entladen bekommen freigegeben nicht, die ich nach dem CRT-Detektoren Lebenszyklus glauben. Grundsätzlich gibt es eine Menge von speien, die Fehlalarme.

Andere Tipps

würde ich empfehlen die Verwendung von Valgrind . Wenn Sie den Prozess heruntergefahren, es wird Ihnen alle durchgesickert Speicher zeigen. Es sei denn, Ihre Abschaltung irgendwie den Zyklus bricht, sollten alle Zyklen wie durchgesickert Speicher angezeigt und Valgrind werden Ihnen sagen, wo in Ihrem Code der Speicher ursprünglich aus zugewiesen wurden.

Ich war verantwortlich für die Gestaltung eines Kreditrisikosystem einmal (in C ++, aber das ist nicht relevant). Diese Dinge sind wirklich große Graphen mit Risiko an den Knoten zugeordnet. Wir hatten eine einfache Heuristik zu finden, wenn wir in einem Zyklus sind - wenn wir mehr als 500-mal durchlaufen (ich die genaue Zahl vergessen - es war konfigurierbar), war die Antwort ja. Die meisten Zykluserkennungsschemata stützen sich auf Heuristiken wie diese.

Ich habe in der Vergangenheit ähnliche Probleme gehabt -. Speicherleck durch zyklische Verweise auf Shared_ptr, die für Monate ging unentdeckt

Achten Sie auf "Caches". Ich habe ein Objekt (nennen wir es „Factory“), welche Elemente behandelt out ( „Widget“). Widgets hatte die Eigenschaft, A) Unveränderliche, und B) hat ein shared_ptr<Factory> seinen Schöpfer (es manchmal andere Widgets erstellt, etc). Alles funktionierte gut, bis ich ein Widget-Cache-Fabrik hinzugefügt - da die Widgets unveränderlich waren, machte es Sinn, sie zu cachen, das gleiche Widget jedes Mal zurück geben sie angefordert wurden. Mein Cache war ein Cache von shared_ptr<Widget>, so Augenblick still Leck. Die Updates sind offensichtlich, so dass ich nicht in sie gehen.

Am Ende auf der Plattform lehnen konnte ich mir ein solche Speicherlecks von der CRT zu erkennen, wurde mit. Visual Studio CRT hat Speicher durchgesickert Erkennung und Meldung, die ich in meinem Testprogramm aktiviert Regressionen zu verhindern:

int main()
{
    // code code code
    // code code code

#ifdef _MSC_VER
    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );
    _CrtDumpMemoryLeaks();
#endif
}

GCC hat wahrscheinlich ähnliche Grund Leck Berichterstattung, aber ich weiß nicht, was es ist.

Ich denke, die einfachste Antwort ist, dass es nur so viele intelligenten Zeiger ist für Sie tun kann:

Ich schlage vor, Aufnahme, wenn Sie machen eine Schleife, (einfach, wenn Sie erstellen alle drei Objekte auf einmal, trickier sonst ...), und prüfen Sie dann diesen Datensatz, wo Sie unlink Objekte löschen / oder nur in regelmäßigen Abständen, wenn das nicht möglich ist.

Sie könnten eine Art von Debug-Schnittstelle implementieren, die eine Liste von shared_ptrs dieses Objekt im Besitz zurückgibt. Sie müssen dieses in einer Shared_ptr gespeichert für jede Klasse tun. Jetzt haben Sie eine allgemeine grafische Darstellung, die Sie durchqueren kann und Zykluserkennungsalgorithmen auf sie aus. Ich glaube, Tarjan der stark verbundenen Komponente Algorithmus könnte für diese Arbeit aber Graphentheorie ist nicht meine Stärke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top