实现智能指针时引用链接优于引用计数的优势?

时间:2015-09-23 23:37:53

标签: c++ shared-ptr smart-pointers doubly-linked-list reference-counting

  

参考链接优于引用计数的优点是   前者不使用额外的免费商店,这使它更可靠:   创建引用链接的智能指针不会失败。该   缺点是引用链接需要更多内存   簿记(三个指针与一个指针加一个整数)。   此外,当您复制智能时,引用计数应该更快一些   指针,只需要间接和增量。列表   管理稍微复杂一点。总之,你应该使用   仅在免费商店稀缺时才引用链接。除此以外,   更喜欢参考计数。

这是来自Modern C ++ Design:Generic Programming and Design Pattern Applied的引用。我不明白为什么基于引用链接的智能指针不使用额外的免费存储然后变得更可靠,即永远不会失败?有人能对此提供一些解释吗?谢谢!

1 个答案:

答案 0 :(得分:2)

当您将引用计数为智能指针作为自动变量并从免费存储中分配存储以进行管理时,即使指针的成员变量将在自动存储上,创建用于簿记和管理对象的控制块也会在免费商店。一个简单的例子:

class RefCountIntPtr {
    int *pointee;
    int *count;

public:
    RefCountIntPtr(int *x) {
        if (x) {
            pointee = x;
            // allocate an int from free store and assign 1 to it
            count = new int(1);
        }
    }
};

int main() {
    RefCountIntPtr sp;
}

此处,sp的{​​{1}}和pointee将在堆栈上分配,而count指向的将在堆上分配。假设实现(编译器)使用堆进行自由存储和堆栈以进行自动存储。

另一方面,引用链接智能指针没有来自免费存储的控制块分配,它们只有三个指针作为成员变量,所有这些指针都分配在自动存储上。创造更多?没问题,它们都将在自动存储中,当你使它们指向相同的指针时充当链表。区别在于,链接列表不是具有显式计数,而是作为隐式计数,当所有链接都消失时,我们知道计数为0并且需要释放指针。

对可靠性进行评论的原因是,当您从免费商店分配时,在特殊情况下泄漏的可能性更高。但是,自动变量分配更加可靠,因为编译器会自动处理释放。有关详细信息,请参阅Why should C++ programmers minimize use of 'new'?