[英]shared_ptr & weak_ptr conversions
我正在嘗試使用std::shared_ptr
和std::weak_ptr
來處理對象。 場景是這樣的:
我有類channel
對象,它是從抽象類abstract::channel
(帶有純虛函數)派生的。 我有一個容器channelContainer
( std::vector
)包含channel
對象的共享指針( std::shared_ptr
)。
現在,我有一個包含弱指針(std::weak_ptr)
的deque (std::deque)
(std::weak_ptr)
到channelContainer
中的每個對象。 讓我們命名這個deque freeChannelQueue
。
所以我們說:
std::vector<std::shared_ptr<abstract::channel> > channelContainer;
std::deque<std::weak_ptr<abstract::channel > > freeChannelQueue;
//Assuming that both the containers are filled appropriately How do I go about implementeing the below functions?
abstract::channel& get_free_channel() {
//This should return a free channel object from 'freeChannelQueue' and pop the queue.
}
bool release_channel(abstract::channel& ch) {
//This should convert 'ch' to a std::weak_ptr (or std::shared_ptr) and push it to 'freeChannelQueue'
}
我對'如何將對象的引用轉換為弱指針?'特別感興趣?
你不能
將對象的引用轉換為弱指針
您可以使用assignment =
eg從共享指針創建一個弱指針
std::shared_ptr<abstract::channel> get_free_channel();
然后
bool release_channel(std::shared_ptr<abstract::channel> ch)
{
std::weak_ptr<abstract::channel> weak_ch = ch;
//...
}
注意一生 - shared_ptr會在指向它們的弱指針之前消失嗎?
這是你的設計嗎? 因此,存在一些嚴重的通道壽命問題。 例如 - 如果代碼調用get_free_channel()
那么您的聲明會返回對對象的引用,但是它們無法保證它的生命周期包含它們的使用。 這可能無關緊要取決於您從中調用函數的客戶端代碼,但您可能希望返回shared_ptr
,如:
std::shared_ptr<abstract::channel> get_free_channel()
{
// return free channel from 'freeChannelQueue' and pop the queue
// take a scoped lock on the free queue if necessary
while (!freeChannelQueue.empty())
{
auto p_channel = freeChannelQueue.back();
freeChannelQueue.pop_back();
std::shared_ptr<abstract::channel> p = p_channel.lock();
if (p) return p;
}
// freeChannelQueue empty... throw or return nullptr etc..
}
關於“釋放”......
bool release_channel(abstract::channel& ch) {
//This should convert 'ch' to a std::weak_ptr (or std::shared_ptr) and push it to 'freeChannelQueue'
}
這樣,只有在搜索channelContainer
才能找到對象然后從那里獲取weak_ptr或shared_ptr時,才有可能。 再次 - 您應該更改原型,以便它直接接收shared_ptr
或weak_ptr
,鎖定空閑隊列然后按下智能指針....
總而言之,如果不了解通道生命周期的管理方式,以及各種線程如何嘗試使用對象和隊列,很難給出有用的建議。 我希望上述內容有所幫助,即使只是在提出一個更精確的問題。
我理解你這樣的問題:你有一個容器來容納你所有的通道對象,你有第二個容器來維護你的應用程序可以使用哪些通道的順序。 然后,您希望接口返回對客戶端的下一個空閑通道的引用,並在客戶端完成后將通道釋放回容器。
要獲取對通道的引用,可以使用lock從weak_ptr創建shared_ptr,然后取消引用(只是不刪除底層對象!)。 但是,我沒有看到另一種合理的方法,你需要在通道容器中搜索匹配的對象,並再次從匹配的shared_ptr創建一個弱指針。
我會考慮不使用weak_ptr和引用,只需堅持使用shared_ptr。 由於您使用deque來維護哪些通道可用,因此您可以保留可用的shared_ptr。 如果您很高興您的客戶端在完成后始終會釋放頻道,您可能不需要所有對象的容器,只有免費頻道的雙端隊列 - 取決於您的整體設計。
正如其他人所說,您需要考慮頻道對象的生命周期以及客戶端如何使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.