Durchsickerte Mock-Objekte, wenn GoogleMock zusammen mit Boost :: Shared Pointers verwendet wurde

8

Für dieses spezielle Szenario bin ich nicht in der Lage, die Lecks loszuwerden.

Ich erhalte die Nachricht von durchgesickerten Mock-Objekten, wenn ich den Test ausführe. Die konkrete Nachricht:

ClassElementFixture.h: 102: Fehler: Dieses Mock-Objekt (im Test ClassElementFixture.initialize verwendet) sollte gelöscht werden, ist aber nie. Seine Adresse ist @ 0x940a650.

Ich habe die Zeile markiert, auf die sich der Fehler bezieht. Hier eine vereinfachte Version meines Codes:

%Vor%

Ich habe es schon gefunden Warum gibt GoogleMock mein shared_ptr aus?

bei Stack-Overflow, was verwandt ist. Aber die Vorschläge von dort beheben mein Problem nicht: X

Die einzige Möglichkeit, die ich gefunden habe, um den Fehler zumindest zu unterdrücken, ist:

%Vor%

Allerdings ist das keine sehr saubere Lösung =)

Also, wie die Lecks richtig loswerden?

    
Alex 06.09.2012, 08:29
quelle

3 Antworten

3

Wenn Sie intelligente Zeiger verwenden, müssen Sie immer noch eine klare Vorstellung von Eigentümerschaft haben, sonst können Sie schlechte Leistung, zyklische Abhängigkeiten und Speicherlecks bekommen.

Ich schlage vor, dass die Standardauswahl des intelligenten Zeigers unique_ptr für eindeutiges Eigentum sein sollte und rohe Zeiger für Beobachter verwenden soll.

Wenn die Beobachter den Besitzer überleben könnten, dann wechseln Sie zu einem shared_ptr für den Eigentümer und weak_ptr für die Beobachter.

Verwenden Sie "shared" shared_ptr nur als letztes Mittel, wenn Sie keinen eindeutigen Eigentümer haben und auf zyklische Abhängigkeiten achten.

    
Chris Drew 25.10.2014, 07:08
quelle
2

Verwenden Sie keine geteilten Zeiger. Oder wenn du sie wirklich benutzen musst, stelle sicher, dass sie am Ende des Tests auf 0 zurückkommen und zerstört werden.

    
Sorin 27.11.2013 21:51
quelle
1

Es ist eine alte Frage, aber ich sehe niemanden, der die Lösung erwähnt, die ich gerade gefunden habe.

Ich sah den gleichen Fehler, bis ich einen virtuellen Destruktor zu der Klasse hinzufügte, die ich verspottete. Stellen Sie in Ihrem Fall sicher, dass Sie einen virtuellen Destruktor für ParserElementFactoryMock haben. Sinnvoll, denn ohne den virtuellen Destruktor gibt das Mock-Objekt seine Ressourcen nicht frei, wenn es den Gültigkeitsbereich verlässt.

    
FishesCycle 08.03.2016 23:15
quelle