簡體   English   中英

shared_ptr和weak_ptr轉換

[英]shared_ptr & weak_ptr conversions

我正在嘗試使用std::shared_ptrstd::weak_ptr來處理對象。 場景是這樣的:

我有類channel對象,它是從抽象類abstract::channel (帶有純虛函數)派生的。 我有一個容器channelContainerstd::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_ptrweak_ptr ,鎖定空閑隊列然后按下智能指針....

總而言之,如果不了解通道生命周期的管理方式,以及各種線程如何嘗試使用對象和隊列,很難給出有用的建議。 我希望上述內容有所幫助,即使只是在提出一個更精確的問題。

我理解你這樣的問題:你有一個容器來容納你所有的通道對象,你有第二個容器來維護你的應用程序可以使用哪些通道的順序。 然后,您希望接口返回對客戶端的下一個空閑通道的引用,並在客戶端完成后將通道釋放回容器。

要獲取對通道的引用,可以使用lock從weak_ptr創建shared_ptr,然后取消引用(只是不刪除底層對象!)。 但是,我沒有看到另一種合理的方法,你需要在通道容器中搜索匹配的對象,並再次從匹配的shared_ptr創建一個弱指針。

我會考慮不使用weak_ptr和引用,只需堅持使用shared_ptr。 由於您使用deque來維護哪些通道可用,因此您可以保留可用的shared_ptr。 如果您很高興您的客戶端在完成后始終會釋放頻道,您可能不需要所有對象的容器,只有免費頻道的雙端隊列 - 取決於您的整體設計。

正如其他人所說,您需要考慮頻道對象的生命周期以及客戶端如何使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM