[英]Boost shared pointers C++ : shared pointer unable to free resource on release
我遇到了一個問題,我無法擺脫最后一個共享指針,我實際上需要它。
所以我擁有的是經理和一些工人線程。 管理器保存一組指向不同資源的共享指針。 工作人員可以向經理詢問指向資源的共享指針。 總會有一個或多個工作者具有指向資源的共享指針。 我的最終目標是,當所有工作人員完成資源后,資源將被刪除。 但是,在此方案中,管理器始終維護一個指向資源的共享指針,因此即使沒有工作者掛在共享指針上,資源也不會被刪除b / c引用計數應始終至少為1,因為經理正在堅持下去。 我需要管理器掛起指向引用的共享指針,這樣如果有任何工作者要求共享指針,管理器將能夠提供一個。
編輯:創建資源時,工作人員已擁有該資源。 所以在它創建時它的引用計數應該是兩個(經理有它,而一個工人有它)。 當引用計數命中一個(只有管理員擁有它)時,我希望它被刪除。 如果資源已被刪除且工作人員正在尋找它,則應重新創建資源。
edit2:一些代碼:
SomeSharedPointer Manager::getResource(String unique_id)
{ // if unique id exists, return its mapped shared pointer, if unique id doesn't exist, create the resource, assign it a shared pointer, and stick it in the map
}
class Worker
{
SomeSharedPointer my_sp;
Worker()
{
String someUniqueId = "http://blah.com"
my_sp = Manager::getResource(someUniqueId);
// do some work on the resource
}
~Worker()
{
my_sp.reset(); // done with resource
}
}
為什么管理器在不需要保留控制權的情況下持有對象的shared_ptr
(強引用),只傳遞它? 沒有看到你的代碼,似乎讓經理持有一個weak_ptr
,然后將其傳遞給工人,工人將其鎖定在他們端的shared_ptr
上。 這將允許經理傳遞引用而不擁有自己的引用。
class Worker
{
SomeSharedPointer my_sp;
Worker()
{
String someUniqueId = "http://blah.com"
weak_ptr wp = Manager::getResource(someUniqueId);
my_sp = wp.lock();
// do some work on the resource
}
~Worker()
{
//my_sp.reset(); // handled automatically, as part of how shared pointers work
}
}
如果一個worker完成並釋放了資源,它將被銷毀,並且管理器將不再能夠getResource
引用(可以在getResource
測試並重新加載)。 這似乎不是最佳選擇,但它是您設計的一部分,所以它應該可以很好地工作。
編輯:你也可以讓getResource
返回一個共享指針,並讓管理器保持弱指針,嘗試鎖定,在內部進行檢查/重新加載,然后返回共享指針。 由於無法直接創建weak_ptr
,因此可能會更好一些。
另一方面,您可以提供一個函數來補充為工作者提供釋放它的指針並在管理器中計數檢查的函數。
當一個worker要求指針使用lock方法創建一個共享指針時,在manager中使用一個弱指針和worker中的共享指針。
如在boost :: shared_ptr fptr = weakfoo.lock();
如果共享指針為空,則指針已被最后一個工作程序釋放或尚未創建,需要創建
我肯定會避免任何涉及查看引用計數的解決方案......只會出現痛苦:)
我認為以下是關鍵:
我需要管理器掛起指向引用的共享指針,這樣如果有任何工作者要求共享指針 ,管理器將能夠提供一個。
您需要決定在哪個點上不再需要工作人員來尋求共享指針。 一旦你知道了這種情況,master就可以簡單地重置它的共享指針實例,從而釋放引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.