scr*_*eeb 2 c++ smart-pointers
如果我们有一些智能指针类,它可以接受任意对象并提供引用计数指针,那么我们如何实际存储对引用进行计数的整数?引用计数必须在指向同一对象的智能指针类的所有实例之间共享。
我想到的一种解决方案是将引用计数存储在我们指向的对象中,但这对于一般解决方案来说并不是很好,因为每个对象都必须提供引用计数本身或从提供引用计数的某个对象继承它。
它“通常存储”在对象设计所需的任何位置。侵入式智能指针需要T它们一起使用来为引用计数提供存储。这就是他们“侵入性”的原因;他们侵入物体。
您概述的设计指定“可以采用任意对象”。因此,侵入式设计是不可能的。
由于智能指针的许多实例必须能够访问同一引用计数对象,因此该引用计数必须独立于任何一个实例。并且由于它也必须独立于T,因此它必须是一个其生命周期独立于两者T以及引用它的任何智能指针实例的对象。
因此,智能指针在声明 a 的所有权后T,还必须创建引用计数对象来管理它。通常,这是通过堆分配此类对象来完成的。智能指针的副本还获得指向引用计数的指针。
这也是为什么让两个不同的std::shared_ptr构造函数声明对同一个构造函数的所有权是非法的T*。您可以从shared_ptr已经拥有 的中进行复制T*,但不能T*直接将 本身传递给构造函数。因为T无法访问引用计数,shared_ptr所以 的构造函数不会知道其他人拥有它,因此它将创建第二个引用计数块。