引用计数——内部引用问题

Reference counting - internal references problem

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

最简单的例子:

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

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

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

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