ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – weak_ptr在shared_ptr中的作用

2019-08-30 16:08:42  阅读:295  来源: 互联网

标签:cyclic-reference weak-ptr c shared-ptr smart-pointers


我理解shared_ptr如何工作,除了weak_ptr的角色.我理解它在那里检测循环引用时引用计数不为零,但除此之外,我不明白它究竟是如何做到的.它有什么作用?

解决方法:

另见:When is std::weak_ptr useful?为什么,How does weak_ptr work?为何.

我将举例说明我如何使用它,虽然我掀起的示例代码有点令人费解,所以请耐心等待:

#include <vector>
#include <memory>
#include <ostream>

int main()
{
  // Fill container with values 1-50. This container OWNS these values.
  std::vector<std::shared_ptr<int>> owning_container;
  for(int i = 1; i <= 50; ++i)
  {
    owning_container.emplace_back(std::make_shared<int>(i));
  }

  // Create a sepearate container that references all owned values that are multiples of 5.
  std::vector<std::weak_ptr<int>> referencing_container;
  for(std::shared_ptr<int> const& i : owning_container)
  {
    if((*i) % 5 == 0)
    {
      // Make weak_ptr that references shared_ptr
      referencing_container.emplace_back(i);
    }
  }

  // Go through the owned values and delete all that are multiples of 10.
  for(auto it = owning_container.begin(); it != owning_container.end();)
  {
    std::shared_ptr<int> const& i = *it;
    if(*i % 10 == 0)
    {
      it = owning_container.erase(it);
    }
    else
    {
      ++it;
    }
  }

  // Now go through the referencing container and print out all values.
  // If we were dealing with raw pointers in both containers here we would access deleted memory,
  //   since some of the the actual resources (in owning_container) that referencing_container
  //   references have been removed.
  for(std::weak_ptr<int> const& i_ref : referencing_container)
  {
    // Check if the shared resource still exists before using it (purpose of weak_ptr)
    std::shared_ptr<int> i = i_ref.lock();
    if(i)
    {
      std::cout << *i << std::endl;
    }
  }

  return 0;
}

在这里,我们有一个包含一些共享资源的容器 – 在这种情况下为 – (shared_ptr),另一个容器需要引用(weak_ptr).引用不拥有资源,只需要能够访问它(如果存在).为了判断被引用的资源是否仍然存在,我们使用weak_ptr :: lock()将weak_ptr转换为shared_ptr.那些仍然存在的资源将具有lock()返回的有效shared_ptr.那些不再存在的将返回null shared_ptr. shared_ptr有一个运算符bool(),我们可以在尝试使用它之前检查它是否为null.

如果你制作的游戏中游戏中的每个对象都由game_object代表,那么一个不太复杂的场景可能就是如此.假设你有一种寻求敌人的逻辑,这需要一个目标game_object来寻求.使用上面的方法,你可以让敌人抓住一个weak_ptr< game_object>.它不拥有这个game_object.如果其他东西杀死其目标,其目标应该死亡;如果敌人持有一个shared_ptr而不会陷入某种不稳定状态.这样,如果敌人的目标仍然存活(可以通过锁定weak_ptr来检查),它可以执行搜索逻辑;否则它可以找到新的目标. game_object的“所有者”可能是某种类型的game_world类 – 这将有一个shared_ptr< game_object>的容器.当敌人需要一个新目标时,它可以搜索这个容器并从game_world的shared_ptr创建它的weak_ptr.

标签:cyclic-reference,weak-ptr,c,shared-ptr,smart-pointers
来源: https://codeday.me/bug/20190830/1769163.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有