2014-02-05 8 views
14

Ich bin neu bei shared_ptr und ich versuche, die genaue Funktionalität der .reset() - Funktion herauszufinden.Löscht mit .reset() auf einem std :: shared_ptr alle Instanzen

#include <memory> 
#include <stdio> 

using namespace std; 
class SomeClass{}; 

int main() 
{ 
    shared_ptr<SomeClass> sp (nullptr); 

    //do some stuff, sp now has 10 co-owners 

    cout << sp.use_count << endl; 
    sp.reset(); 
    cout << sp.use_count << endl; 
    return 0; 
} 

ausgeben würde

10 
0 

So, da ich die Reset-Funktion verwendet werden alle Instanzen aus dem Speicher gelöscht? Wie in, habe ich gerade alle möglichen Speicherlecks mit sp beseitigt? Offensichtlich war das ein Spielzeugbeispiel, das ich schnell erfunden habe, tut mir leid, wenn es irgendwelche Fehler hat.

Follow-up-Situation:

shared_ptr<SomeClass> returnThis() { 
    shared_ptr<SomeClass> someObject(new SomeClass(/*default constructor for example*/)); 
    return someObject; 
} 

somehere in Haupt:

shared_ptr<SomeClass> mainObject; 
mainObject = returnThis(); 

Does mainObject eine Verwendungsanzahl von 2 haben, weil in someobject eine Funktion erstellt wurde, aber nie gelöscht? Oder ist es eins und die Bereinigung wird automatisch durchgeführt, wenn der Wert zurückgegeben wird?

+0

Whoops! Wenn Sie eine weitere Frage stellen möchten, klicken Sie oben auf der Seite auf die Schaltfläche "Frage stellen". Die Kurzgeschichte besagt, dass 'shared_ptr' existiert, um alle diese Dinge automatisch zu behandeln. Wenn also der * last * shared Pointer den Bereich verlässt, wird das Objekt zerstört. –

Antwort

21

Wenn Sie .reset() verwenden, beseitigen Sie einen Besitzer des Zeigers, aber alle anderen Besitzer sind immer noch da. Hier ein Beispiel:

#include <memory> 
#include <cstdio> 

class Test { public: ~Test() { std::puts("Test destroyed."); } }; 

int main() 
{ 
    std::shared_ptr<Test> p = std::make_shared<Test>(); 
    std::shared_ptr<Test> q = p; 
    std::puts("p.reset()..."); 
    p.reset(); 
    std::puts("q.reset()..."); 
    q.reset(); 
    std::puts("done"); 
    return 0; 
} 

Das Programm Ausgabe:

 
p.reset()... 
q.reset()... 
Test destroyed. 
done 

Beachten Sie, dass p und q sind beide Eigentümer des Objekts, und sobald beide p und q zurückgesetzt werden, dann die Instanz zerstört.

+1

Danke für die Antwort! Als Follow-up Frage, sagen wir, ich habe eine Funktion, die Rückgabetyp ist ein std :: shared_ptr, aber die shared_ptr, die ich zurückgeben wurde innerhalb dieser Funktion erstellt, wird die shared_ptr automatisch dekrementieren ihre use_count um 1? Ich werde ein Follow-up-Beispiel oben veröffentlichen. –

1

Die Methode .reset() gilt nur für das Objekt, das sie aufgerufen hat.

Es ersetzt nur den Zeiger, den die Variable hält.

5

Nein, der ganze Zweck von shared_ptr ist, dass Sie es nicht von einem Ort löschen können, wenn jemand es in einem anderen verwendet. sp.reset() verringert nur use_count um eins und ersetzt sein Objekt durch nullptr.