这个对象引用计数器可以用shared_ptr或一些智能指针替换吗? Live code

如何解决这个对象引用计数器可以用shared_ptr或一些智能指针替换吗? Live code

这是一个模拟“烫手山芋”的示例程序。 Potato 对象被创建并可以通过复制、移动等方式传递,一旦 Potato 最终被销毁而没有传递,它就会退出程序。

Live code

我通过为每个 马铃薯提供唯一 ID 并使用单例马铃薯管理器 (PotatoFarm) 来跟踪引用计数来实现此目的。每次构造或复制 Potato 时,我都会增加引用计数。每次它被销毁时,我都会减少引用计数,一旦它达到零,我就“丢弃”土豆。

class Potato {
public:
    using Id = std::size_t;

    // new potato,assign new id and increment ref count
    Potato() : _id(PotatoFarm::get().nextId()) {
      PotatoFarm::get().incRefCt(_id);
    }

    // copied potato,just increment ref count
    Potato(const Potato& p) : _id(p._id) {
      PotatoFarm::get().incRefCt(_id);
    }

    // dtor,decrement and check reference count
    ~Potato() {
        if (PotatoFarm::get().decChkRefCt(_id)) { // returns true when ref ct reaches 0
          std::cout << "dropped the hot potato\n";
          exit(1);
        }
    }

    // Example of a method that possibly mutates Potato and returns the object back
    Potato passthru() {
        std::cout << "passing thru\n";
        return *this;
    }
private:
    Id _id;
};

单身经理:

class PotatoFarm {
public:
  using Id = std::size_t;
  PotatoFarm() : _next(0) {}
  // get singleton instance
  static PotatoFarm& get() {
      static PotatoFarm s_obj;
      return s_obj;
  }
  Id nextId() { return _next++; }
  // reference counting of Potatoes by id
  std::size_t incRefCt(Id id) { return ++_refCt[id]; }
  bool decChkRefCt(Id id) { // return true when 0
      if (--_refCt[id] == 0) {
        _refCt.erase(id);
        return true;
      }
      return false;
  }
private:
  Id _next;
  std::unordered_map<Id,std::size_t> _refCt;
};

以及传递土豆的代码

Potato bar() {
    std::cout << "in bar\n";
    return Potato();
}

Potato foo() {
    std::cout << "in foo\n";
    Potato hp = bar().passthru();
    std::cout << "after bar\n";
    return hp;
}

int main(void) {
    Potato hp = foo();
    std::cout << "after foo\n"; // this should be printed!
    // but the return code of the program should be 1
    return 0;
}

这会根据需要返回:

in foo
in bar
passing thru
after bar
after foo
dropped the hot potato

与其创建自己的引用计数器,还可以仅通过传递智能指针来简化此操作吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?