gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:58:31 26 4
gpt4 key购买 nike

使用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 Arm\n"; }
~Arm() { std::cout << "Destroying Arm\n"; }

shared_count_ptr<Hand> hand;
};

struct Hand
{
Hand() { std::cout << "Creating Hand\n"; }
~Hand() { std::cout << "Destroying Hand\n"; }

shared_count_ptr<Arm> arm;
};

int main()
{
boost::shared_ptr<Arm> savedArm;

std::cout << "Scope 0 entered\n";
{
std::cout << "\tScope 1 entered\n" ;

boost::shared_ptr<Arm> arm( new Arm );
{
std::cout << "\t\tScope 2 entered\n";
boost::shared_ptr<Hand> hand( new Hand );

hand->arm.link( arm, arm->hand );
arm->hand.innerPtr = hand;

savedArm = arm;
}
std::cout << "\t\tScope 2 exited\n";
}
std::cout << "\tScope 1 exited\n";
std::cout << "\tScope 0 about to exit\n";

return 0;
}

一般概念是,在虚构的 shared_count_ptr 眼中, ARM 和手实际上是同一个对象。

所以:

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

最佳答案

这是一个简单的测试。在 17 个顶点上创建一个完整的图,这样程序只指向顶点 0。开始随机删除边。你的想法行得通吗? (剧透:事实并非如此)。

关于c++ - 有共享引用计数智能指针这样的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13619779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com