gpt4 book ai didi

c++ - 如何使一个 shared_ptr 的所有拷贝都等于另一个 shared_ptr?

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:29 25 4
gpt4 key购买 nike

我想不通。看起来我遗漏了一些简单的东西?我要在 MakePointToSameValue 中输入什么,以便在点 (1)

  • b.ptr 和c.ptr 与a.ptr 指向同一个
  • 换句话说,a.ptr.get() == b.ptr.get() == c.ptr.get()
  • b.ptr 和 c.ptr 最初指向的值被删除

?

struct Test
{
public:
Test( int val ) :
ptr( std::make_shared< int >( val ) )
{
}

void MakePointToSameValue( Test& other )
{
//what do I put here?
//other.ptr = this->ptr; //doesn't do it
}

private:
std::shared_ptr< int > ptr;
};

Test a( 0 );
Test b( 5 );
Test c( b );

b.MakePointToSameValue( a );

//(1)

复制 ptr 不起作用,因为它不会改变 c(好吧,c.ptr 的引用计数减一)。请注意,我使用 int 只是为了简单起见,但它应该适用于不可复制的类型。

为什么?我有一个代表值的类,任何类型的值,用于某种编译器。实际值及其存储方式在实例化时已知。唯一已知的是类型。因此,该类存储一个 shared_ptr,其中包含稍后确定的值的占位符(对应于在作为指针或引用传递时编译函数定义的参数:编译器只知道类型,仅此而已)。在运行时,占位符应替换为实际值。

编辑 新的一天开始,想到了这个。我知道这很简单。

void MakePointToSameValue( Test& other )
{
other.ptr.swap( ptr );
ptr.reset();
ptr = other.ptr;
}

现在的另一个问题是:对于任何符合标准的指针,上述内容是否会按预期工作?

最佳答案

这里你需要两层间接。虽然你是对的所有shared_ptr对象指向一个包含计数和指向实际值的指针的公共(public)元数据 block ,如果您尝试更新该 block 以指向不同的对象,您现在将有两个指向相同值的元数据 block ,每个元数据 block 都有它们的对什么是引用计数有不同的看法。 shared_ptr 的正确数字(从某种意义上说它与引用计数相匹配)使用每个元数据 block 的对象,因此每个 block 上的计数最终将达到零,但无法知道哪个 block 是最后一个达到零计数的 block (因此应该删除该值)。所以shared_ptr明智地不允许更改元数据中的对象指针。您只能关联 shared_ptr使用新的元数据 block 、新计数、新对象。指向同一对象的其他指针不受影响。

正确的方法是使用第二层间接 ( shared_ptr<shared_ptr<int> > )。这样一来,每个对象只有一个元数据 block 和一个计数。您的更新发生在中间 shared_ptr 上。

关于c++ - 如何使一个 shared_ptr 的所有拷贝都等于另一个 shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11310636/

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