2012-10-20 82 views
2

我在C++中有一個與boost::shared_ptr<>有關的問題。我現在願意履行我的列表項的智能刪除:如果該項目不在使用在列表中正確使用boost :: shared_ptr

  • 如果產品在使用中,不要做任何事情,後來將其刪除
  • ,刪除它

這是我的程序所需的行爲。

我真的想知道如何做到這一點,因爲std::list<boost::shared_ptr<object> >刪除/擦除功能會導致刪除shared_ptr<>,從而刪除真實物體。

所以我終於想出了這個解決方案:使用std::list<object*>並從boost::enable_shared_from_this<>繼承object。這樣,當有人需要使用列表中的項目時,我給他們object->shared_from_this()

我的問題有以下幾點:

  • 請問這方面所期望的行爲?
  • shared_from_this()相關聯的boost::shared_ptr<>是否考慮了對列表中對象的引用?

我希望我的問題足夠明確,並且有人能夠幫助我。正確使用列表中的智能指針是我希望能夠使用的。

謝謝

+2

'std :: list >刪除/擦除功能會導致刪除真實對象*僅當它是最後一次引用對象*的shared_ptr時。這正是你說你想要的。我猜你正在使用shared_ptr和普通指針指向同一個對象。答案很簡單,不要那樣做,只有shared_ptrs,它會按照你所說的要求工作。有時我想知道新手爲自己生活困難的能力。 – john

+0

感謝您的回答。那麼,你說的是我的想法。在我的程序中,我得到了兩倍的免費(這是相當大的),並認爲我錯誤地認爲是「valgrind」。我試圖在一個小程序中重現它,但不能。我想我是你說的新手。感謝您的幫助 – Rippalka

回答

4

當你刪除一個shared_ptr你不刪除的真正對象,除非它不使用其他任何地方。這就是關於使用shared_ptr的關鍵。例如,如果您將列表中的一個元素複製並將其賦予另一個函數,然後從列表中刪除該元素,則該實際對象將不會被刪除,因爲它仍然在其他地方被引用。

+0

我在我剛剛製作的一個小程序中獲得了正確的行爲。確切地說,你解釋了什麼。謝謝 – Rippalka

+0

很高興幫助! – alestanis

相關問題