有共享引用计数智能指针这样的东西吗

Is there such a thing as a shared reference count smart pointer?

本文关键字:指针 引用 共享 智能      更新时间:2023-10-16

使用boost::shared_ptr的程序员需要避免循环,这样就不会造成资源泄漏。一般建议是在可能创建这样一个循环的情况下使用boost::weak_ptr。然而,这样做会在意图上造成差距,人们可能更喜欢使用shared_ptr,但仅仅因为循环问题而没有这样做。

不过,在我看来,应该可以创建一种特殊的shared_ptr,通过链接循环中所有指针的引用计数来避免循环问题。既然我能想到一种方法,我想知道这样的事情是否存在。

为了证明我没有疯,或者也许我疯了,我提供了以下考虑不周、丑陋的概念证明:

#define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
#include <boost/shared_ptr.hpp>
#include <iostream>
template <typename T>
struct shared_count_ptr
{
boost::shared_ptr<T> innerPtr;
template <typename TT>
void link( boost::shared_ptr<T> & sharedPtr, boost::shared_ptr<TT> & linked )
{
innerPtr    = sharedPtr;
innerPtr.pn = linked.pn;
}
};
struct Hand;
struct Arm
{
Arm()  { std::cout << "Creating Armn";   }
~Arm() { std::cout << "Destroying Armn"; }
shared_count_ptr<Hand> hand;
};
struct Hand
{
Hand()  { std::cout << "Creating Handn";   }
~Hand() { std::cout << "Destroying Handn"; }
shared_count_ptr<Arm> arm;
};
int main()
{
boost::shared_ptr<Arm> savedArm;
std::cout << "Scope 0 enteredn";
{
std::cout << "tScope 1 enteredn" ;
boost::shared_ptr<Arm> arm( new Arm );
{
std::cout << "ttScope 2 enteredn";
boost::shared_ptr<Hand>  hand( new Hand );
hand->arm.link( arm, arm->hand );
arm->hand.innerPtr = hand;
savedArm = arm;
}
std::cout << "ttScope 2 exitedn";
}
std::cout << "tScope 1 exitedn";
std::cout << "tScope 0 about to exitn";
return 0;
}

一般概念是,在想象中的shared_count_ptr眼中,手臂和手实际上是同一个物体。

因此:

  • 这样的想法在boost中已经存在了吗
  • 如果不是,是因为这是一个糟糕的想法吗(或者我刚刚想出了一些聪明的办法?)

这里有一个简单的测试。在17个顶点上创建一个完整的图,使程序仅指向顶点0。开始随机删除边。你的想法行得通吗?(剧透:没有)。

我想你可以按照这些思路做一些事情。然而,在这样的结构中,每个指针A需要知道每一个其它指针B,使得可以从A到达B,反之亦然。我看不出这怎么可能扩展到超过一小部分互连指针。

看起来,如果你想在没有程序员任何帮助的情况下支持循环引用,你或多或少需要一个全面的垃圾收集器,而不是一个简单的引用计数方案(我希望在这方面被证明是错误的)。