c++ 交换2 shared_ptr的内容

ipakzgxi  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(110)

交换两个shared_ptr的内容时,仅交换内容。当交换之前从另一个创建了一个shared_ptr时,我很惊讶新的shared_ptr副本的内容保持不变。
下面是一个示例:

std::shared_ptr<int> foo (new int(10));
std::shared_ptr<int> bar (new int(20));

auto abc = foo;
std::swap (foo, bar);
std::cout << "foo: " << *foo << '\n';
std::cout << "bar: " << *bar << '\n';
std::cout << "abc: " << *abc << '\n';

它打印:

foo: 20
bar: 10
abc: 10

为什么abc不是20?假设它是foo的副本。

a1o7rhls

a1o7rhls1#

shared_ptr只是一个指向数据的指针。你不是在交换数据本身,而是在交换指针。
让我们一步一步来看看:

std::shared_ptr<int> foo (new int(10));
std::shared_ptr<int> bar (new int(20));

在这些语句之后,您有两个指向两个单独分配的int的指针:

[ foo ] ---> [10]
[ bar ] ---> [20]
auto abc = foo;

然后,该语句创建abc,使其指向foo所指向的同一个已分配的int。所以,在交换之前,你现在有:

[ foo ] -+-> [10]
         |
[ abc ] -+

[ bar ] ---> [20]
std::swap (foo, bar);

然后,交换foobar持有的指针,但将abc中的指针单独保留。所以,在交换之后,你现在有:

+---------------+
    |               |
[ foo ]  +-> [10]   |
         |          |
[ abc ] -+          |
         |          |
[ bar ] -+   [20] <-+

这就是为什么*foo打印20,*bar打印10,*abc打印10。

tktrz96b

tktrz96b2#

当交换两个shared_ptr的内容时,.
这不是你的代码所做的。std::swap(foo,bar)交换指针。它不交换指针。如果你想交换内容,你需要交换内容:std::swap(*foo,*bar)
事实上,它是智能指针,它实际上与您的代码无关。此外,动态分配没有太大变化,因此我们可以使用一个更简单的示例来说明:

int a = 10;
int b = 20;

int* a_ptr = &a;
int* b_ptr = &b;

int* c_ptr = a_ptr;

到目前为止,有两个指针a_ptrb_ptr分别指向abc_ptra_ptr的副本,也指向a

std::swap (a_ptr,b_ptr);

交换a_ptrb_ptr后,现在a_ptr指向bb_ptr指向a。第三个指针c_ptr不受此影响。它仍然指向aab也没有修改。

std::cout << "foo: " << *a_ptr << '\n';
std::cout << "bar: " << *b_ptr << '\n';
std::cout << "abc: " << *c_ptr << '\n';

输出将是:

20
10
10

就像你的代码一样。

相关问题