gpt4 book ai didi

c++ - 在稍后阶段设置 std::shared_ptr 源

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:27:04 25 4
gpt4 key购买 nike

我刚开始使用 C++,并试图了解智能指针。显然,下面的代码会崩溃(我想这是因为赋值创建了 shared_ptr 的拷贝?)。有没有办法通过在 ptrs[3] 上调用某种设置方法来保持 foo.Other 更新?

class Foo
{
public:
int X;
std::shared_ptr<Foo> Other;

Foo() : X(10) { }
};

int main()
{
Foo foo;

std::vector<std::shared_ptr<Foo>> ptrs(10);

foo.Other = ptrs[3];

std::shared_ptr<Foo> other = std::shared_ptr<Foo>(new Foo());
ptrs[3] = other;

std::cout << foo.Other->X << std::endl; // throws Access violation exception

return 0;
}

编辑:这是我得到的异常,因为它指向空值:

First-chance exception at 0x01219AEF in Test.exe: 0xC0000005: Access violation reading location 0x00000000. Unhandled exception at 0x01219AEF in Test.exe: 0xC0000005: Access violation reading location 0x00000000.

最佳答案

您的印象似乎是这样做:

foo.Other = ptrs[3];

在两个对象之间创建某种关系,这样如果您更改其中一个对象,那么另一个对象也会随之更改。

shared_ptr 不是这样工作的。它指向的东西是共享的,改变那个东西意味着所有指向它的指针都会看到改变的值(因为只有一个值,它被多个对象拥有)所以这是有效的:

std::shared_ptr<int> p = std::make_shared<int>(1);
assert( *p == 1 );
std::shared_ptr<int> q = p;
*q = 2;
assert( *p == 1 );

但是 shared_ptr 对象本身并不都是彼此相同的拷贝。

它们指向同一事物,这并不意味着它们是同一事物。

如果您将 ptrs[3] 更改为指向不同的内容,这不会同时使 foo.Other 指向不同的内容。如果它这样做会使 shared_ptr 几乎毫无用处,那么您就不可能拥有一个对象的多个所有者,因为一旦他们中的一个停止拥有该对象,所有其他人也会停止拥有它并且它会被摧毁。

相反,只有您更新的 shared_ptr 获得新值,其他 shared_ptr 保留其旧值。

std::shared_ptr<int> p = std::make_shared<int>(1);
assert( *p == 1 );
std::shared_ptr<int> q = p;
assert( *q == 1 );
assert( p == q );
assert( p.get() == q.get() );
assert( *p == *q );
p = std::make_shared<int>(2);
assert( *p == 2 );
assert( *q == 1 );
assert( p != q );
assert( p.get() != q.get() );
assert( *p != *q );

关于c++ - 在稍后阶段设置 std::shared_ptr 源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17004826/

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