17

我正在尝试使用std::shared_ptrand来处理对象std::weak_ptr。场景是这样的:

我有从抽象类(具有纯虚函数)channel派生的类对象。abstract::channel我有一个容器channelContainer( ),其中包含指向对象std::vector的共享指针 ( std::shared_ptr) 。channel

现在,我有一个包含deque (std::deque)指向. 让我们命名这个双端队列。(std::weak_ptr)channelContainerfreeChannelQueue

所以让我们说:

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'
}

我对“如何将对对象的引用转换为弱指针”特别感兴趣?

4

3 回答 3

10

你不能

将对对象的引用转换为弱指针

您可以从共享指针创建一个弱指针,只需使用赋值,= 例如

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 会在指向它们的弱指针之前出现吗?

于 2013-07-08T08:53:57.060 回答
1

这是你的设计吗?实际上,存在一些严重的通道寿命问题。例如 - 如果代码调用get_free_channel()然后你的声明返回给他们一个对象的引用,但他们无法保证它的生命周期包括他们的使用。这可能无关紧要,具体取决于您从中调用函数的客户端代码,但您可能希望返回 a 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锁定空闲队列,然后将智能指针推上......

总而言之,如果不了解通道生命周期的管理方式以及各种线程可能如何尝试使用对象和队列,就很难为您提供有用的建议。我希望以上内容有所帮助,即使只是在提出更精确的问题时。

于 2013-07-08T08:53:03.340 回答
0

我理解您的问题是这样的:您有一个容器来保存所有通道对象,并且您有第二个容器来维护您的应用程序可以使用哪些通道的顺序。然后,您需要一个接口来为您的客户端返回对下一个免费频道的引用,并且当客户端完成后,它会将频道释放回容器。

要获得对通道的引用,您可以使用lock从您的 weak_ptr 创建一个 shared_ptr 然后取消引用它(只是不要删除底层对象!)。但是,我看不出另一种方式是明智的,您需要在通道容器中搜索匹配的对象,并再次从匹配的 shared_ptr 创建一个弱指针。

我会考虑完全不使用weak_ptr 和引用,只使用shared_ptr。由于您使用双端队列来维护可用的通道,因此您可以将可用的 shared_ptr 保留在那里。如果您很高兴您的客户总是在完成后释放通道,您可能不需要所有对象的容器,只需要自由通道的双端队列 - 取决于您的整体设计。

正如其他人所说,您需要考虑通道对象的生命周期以及客户端如何使用它们。

于 2013-07-08T09:19:56.997 回答