2011-07-13 80 views
4

這可能是一個愚蠢的問題,但我只是不確定答案。下面的代碼讀取一個文件,並且對於文件的每一行,智能指針由「new」創建。如果將來使用智能指針,它將被存儲在一個列表中,否則不會被存儲。我應該手動刪除智能指針嗎?

我的問題是:如果智能指針沒有存儲,會導致潛在的內存泄漏?謝謝。

int main(){ 
    .....; 
    std::list<SomeClass> aList; 
    while(inFile >> ss){ 
     std::tr1::shared_ptr<SomeClass> aPtr(new SomeClass()); 
     //do something in foo(aPtr) to aPtr, 
     //if aPtr will be used later, then it's stored in aList 
     //otherwise, it's not stored 
     foo(aPtr); 
    } 
    .....; 
} 
+1

術語「刪除」在任何情況下都是不幸的。對於智能指針,該操作稱爲「重置」。即在這種情況下,你可以寫'aPtr.reset();'。但你很少需要這個;通常在智能指針引用另一個對象時使用它:'aPtr.reset(new SomeClass(「Another Object」));' – MSalters

回答

6

只要你存儲它與智能指針的副本,這不會泄漏內存。當aPtr對象脫離堆棧時(在每個while循環執行結束時),它將被銷燬。如果它是分配對象的唯一持有者,它將刪除它。但是,如果您在其他地方存儲aPtr的副本,那麼它不是分配對象的唯一持有者,並且不會將其刪除。

0

不會導致內存泄漏,因爲shared_ptr會在分配的對象超出範圍時釋放分配的對象。

3

不會發生內存泄漏!

爲什麼?因爲智能指針是...聰明的,它們具有很好的自動清理功能,因爲它可以防止內存泄漏等難以捉摸的錯誤。

因此,對於智能指針,您不需要顯式刪除指針。

0

當指針指定給智能指針時,與指針相關的引用計數器增加1(當指針未分配給任何智能指針時,引用計數器爲0)。 當智能指針超出範圍並被刪除時,sp所跟蹤指針的參考計數器減1:當參考計數器返回到0時,最終刪除指針所指向的存儲器。

在你的情況下,如果SomeClass對象只分配給aPtr,那麼可能一個自動指針會以略少的開銷完成這項工作。 但是,如果您將列表聲明爲std::list<std::tr1::shared_ptr<SomeClass> >,那麼您可以避免複製SomeClass(僅增加對象的引用計數器)並充分利用智能指針。