2012-02-05 27 views
0

將使用類實例成員上的shared_ptr當擁有的「父」超出範圍時正確清理new'ed對象?像下面的例子一樣?當擁有的對象超出作用域時,將使用類實例成員上的shared_ptr正確清理嗎?

下面的代碼示例 - 所以當家庭實例超出範圍時,它會清理/刪除地圖中鏈接到的人員對象?

如果是這樣我怎麼能確認這一點?是否有工具可以使用之前和之後,顯示 - 顯示沒有人對象之後 - 如果我把正常的指針回到我還是要看個人的對象 - 感謝

class Family 
{ 
private: 
    //std::map<int ,Person*> _people; 
    std::map<int ,std::tr1::shared_ptr<Person>> _people; 

public: 
    void AddPerson(int age) 
    { 
     //_people[age] = new Person(age); 
     _people[age] = std::tr1::shared_ptr<Person>(new Person(age)); 
    } 
}; 

    class Person 
    { 
    private: 
     int _age; 
    public: 
     Person(int age) 
     { 
      _age= age; 
     } 
     int GetName(){return _age;} 
    }; 
+3

這將是很好,如果向下票,其中的動機,讓@CodingQuant知道你爲什麼不喜歡他題。 – 2012-02-05 18:56:35

回答

0

通過它去:Family超出範圍,_people被破壞,map析構函數中刪除的所有元素,這意味着對於每個元素,調用析構函數。地圖中的所有shared_ptrS遞減其引用計數。如果引用計數現在爲0,則對象被銷燬。雖然我不明白你爲什麼要在你的例子中存儲一個指針(聰明與否),但我想你有你的理由。

0

是。 shared_ptr是一個引用計數智能指針誰擁有新對象的所有權。

當一個家庭被破壞時,其成員包括_people地圖將被刪除。當地圖被刪除時,它的內容被刪除。

如果_people只是一個包含Person *的地圖,家庭的析構函數將不得不刪除每個人(如果其他人不知道)。

使用shared_ptr對於這個例子來說似乎很好。你可以例如返回一個家庭的兒子shared_ptr,並讓他成爲另一個家庭的父親。

std::tr1::shared_ptr<Person> getSon(){ 
     return someOne... ; 
} 

對於智能指針的東西的工作,你需要通過值,以使拷貝構造函數被調用返回。然後,您可以安全地刪除一個家庭而不會破壞另一家庭。

0

是的。這將按照您的期望和行爲表現。可以在STL結構中使用std::tr1::shared_ptr;另一方面舊的auto_ptr不能。

+0

甚至不要提及'auto_ptr'。沒有人想記住它,並被棄用。 – pmr 2012-02-05 18:41:57

+1

我認爲人們問這個問題的唯一原因是他們多年來一直聽說智能指針(讀'auto_ptr')和STL不混合。 – 2012-02-05 18:43:18

0

地圖_People成員將被清除,但對事不對人共享指針,除非他們中的一些達到引用次數0

相關問題