引用计数——内部引用问题
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是智能指针,它持有对其分配对象的引用
没有简单的方法来处理这个问题。这是引用计数的一个基本问题。
要建立关于为什么会出现这种情况的直觉,请注意检测智能指针循环的难度与处理循环的难度相似。要检测循环,您需要能够遍历“根指针”中的指针。如果你能做到这一点,你就可以标记你在遍历过程中看到的那些。如果你能标记它们,你就可以实现标记和清除,这是垃圾收集。
我已经实现了自己的智能指针,并且一切正常,直到我意识到我的实现存在致命缺陷。问题在于一个对象可以有一个智能指针,它可能持有对自身的引用。如果这是一个单层问题,那么这个问题很容易避免——很容易发生的是一个引用计数 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是智能指针,它持有对其分配对象的引用
没有简单的方法来处理这个问题。这是引用计数的一个基本问题。
要建立关于为什么会出现这种情况的直觉,请注意检测智能指针循环的难度与处理循环的难度相似。要检测循环,您需要能够遍历“根指针”中的指针。如果你能做到这一点,你就可以标记你在遍历过程中看到的那些。如果你能标记它们,你就可以实现标记和清除,这是垃圾收集。