【问题标题】:Reference counting - internal references problem引用计数 - 内部引用问题
【发布时间】:2021-10-06 19:36:00
【问题描述】:

我已经实现了自己的智能指针,一切正常,直到我意识到我的实现存在致命缺陷。问题是一个对象可以有一个智能指针,它可能持有对自身的引用。如果这是一个单层问题,这个问题将很容易避免 - 很容易发生的是一个引用计数的类将间接(通过其成员之一)持有对自身的引用。这意味着一个对象永远不会被删除删除。有什么办法/方法可以解决这个问题吗?

最简单的例子:

class Derived : public Object {
public:
    static ref<Object> Create() { return ref<Object>(new Derived()); }

private:
    Derived() : m_ref(this) // m_ref now holds a reference to Derived instance
    {
        // SOME CODE HERE
    }
    ref<Object> m_ref;
};

Object 是基类,包含引用计数器,ref 是智能指针,持有对其分配对象的引用

【问题讨论】:

  • 引用计数本身可能会遇到这个问题,是的。根据内存管理的工作方式,您可以运行跟踪垃圾收集器(作为备份系统)来处理此类引用周期,或者让程序员通过不编写此类代码来处理它
  • 解决这个问题的标准方法是 1) 不创建循环数据结构和 2) 使用允许破坏以破坏强引用循环的弱引用或非拥有引用
  • 解决方案:将其视为不是问题 :) 这是一个循环引用,如果您有兴趣了解它,可以谷歌搜索。
  • 这就是为什么std::shared_ptr 带有std::weak_ptr

标签: c++ refcounting


【解决方案1】:

没有简单的方法来处理这个问题。这是引用计数的一个基本问题。

要了解为什么会出现这种情况,请注意检测智能指针循环的难度与处理循环的难度相似。要检测周期,您需要能够从“根指针”遍历指针。如果你能做到这一点,你可以标记你在遍历过程中看到的那些。如果可以标记它们,则可以实现标记和清除,即垃圾收集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多