2017-05-22 3 views
0

Ich bin unter Impressionen, dass std :: shared_ptr Speicher nicht freigibt, wenn es außerhalb des Bereichs. Unten ist mein Testcode. Kannst du mir bitte vorschlagen, was ich falsch mache? Ich benutze gtest zum Testen. Wenn ich diesen Test ausführe, kann ich sehen, dass Speicher ständig verbraucht wird. Ich verwende Microsoft VC++ 2013.Was ist los in Std :: shared_ptr <std :: vector <double>>

void ProceedVector() { 
    std::vector<double> * numbers = new std::vector<double>(); 
    for (int ind = 0; ind != 10000; ind++) { 
     numbers->push_back(ind); 
    } 
    std::shared_ptr<std::vector<double>> numbersPtr = std::make_shared<std::vector<double>>(*numbers); 
} 

TEST_F(ManagerTypeConvertorTest, ProceedVector) { 
    for (int ind = 0; ind != 50000; ind++) { 
     ProceedVector(); 
    } 
} 
+2

Willkommen bei Stack Overflow. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

Antwort

2

Jeder Aufruf von ProceedVector hat zwei dynamische Zuweisungen von std::vector<double> Objekten. Ein hier:

std::vector<double> * numbers = new std::vector<double>(); 

Und der andere hier: "zuweisen zu einem shared_ptr dieses Objekt"

std::shared_ptr<std::vector<double>> numbersPtr = std::make_shared<std::vector<double>>(*numbers); 

make_shared bedeutet nicht, Es bedeutet "Zuweisen eines neuen Objekts aus diesen Parametern und Verwalten des neu zugewiesenen Objekts mithilfe einer shared_ptr."

Je nachdem, was Sie den Code erreichen wollen, entweder ersetzen die new Linie mit dem make_shared ein und keinen rohen Zeiger überhaupt verwenden, oder ersetzen Sie die make_shared Linie mit diesem:

std::shared_ptr<std::vector<double>> numbersPtr{numbers}; 

That wird einen shared_ptr konstruieren, der den Speicher verwaltet, auf den numbers zeigt.

+0

Vielen Dank. Es half! –

0

Sie haben zwei Zeiger auf zwei verschiedene Vektoren:

  • Eine, die (den freigegebenen Zeiger eine Kopie des Inhalts aus dem ersten Vektor enthält) werden gelöscht

  • Und eine, die nicht gelöscht wird (der erste Vektor, den Sie mit new erstellen).

+0

Danke. Es funktioniert jetzt –

Verwandte Themen