交换两个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。
shared_ptr只是一个指向数据的指针。您不是在交换数据本身,而是在交换指针。
让我们一步步来看:
Run Code Online (Sandbox Code Playgroud)std::shared_ptr<int> foo (new int(10)); std::shared_ptr<int> bar (new int(20));
在这些语句之后,您有两个指向两个单独的已分配的指针int:
[ foo ] ---> [10]
[ bar ] ---> [20]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)auto abc = foo;
然后,该语句创建abc指向所指向的int同一分配的指针。foo因此,在交换之前,您现在拥有:
[ foo ] -+-> [10]
|
[ abc ] -+
[ bar ] ---> [20]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)std::swap (foo, bar);
foo然后,您将交换和所持有的指针bar,但将指针留在abc原处。因此,交换后,您现在拥有:
+---------------+
| |
[ foo ] +-> [10] |
| |
[ abc ] -+ |
| |
[ bar ] -+ [20] <-+
Run Code Online (Sandbox Code Playgroud)
这就是为什么*foo打印 20、*bar打印 10、*abc打印 10。
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |