交换2个shared_ptr的内容

Thi*_*ium 1 c++ shared-ptr

交换两个s的内容时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';
Run Code Online (Sandbox Code Playgroud)

它打印:

foo: 20
bar: 10
abc: 10
Run Code Online (Sandbox Code Playgroud)

abc在这种情况下为什么不是20?鉴于它是 的副本foo

Rem*_*eau 6

shared_ptr只是一个指向数据的指针。您不是在交换数据本身,而是在交换指针。

让我们一步步来看:

std::shared_ptr<int> foo (new int(10));
std::shared_ptr<int> bar (new int(20));
Run Code Online (Sandbox Code Playgroud)

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

[ foo ] ---> [10]
[ bar ] ---> [20]
Run Code Online (Sandbox Code Playgroud)
auto abc = foo;
Run Code Online (Sandbox Code Playgroud)

然后,该语句创建abc指向所指向的int同一分配的指针。foo因此,在交换之前,您现在拥有:

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

[ bar ] ---> [20]
Run Code Online (Sandbox Code Playgroud)
std::swap (foo, bar);
Run Code Online (Sandbox Code Playgroud)

foo然后,您将交换和所持有的指针bar,但将指针留在abc原处。因此,交换后,您现在拥有:

    +---------------+
    |               |
[ foo ]  +-> [10]   |
         |          |
[ abc ] -+          |
         |          |
[ bar ] -+   [20] <-+
Run Code Online (Sandbox Code Playgroud)

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