交换两个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
的副本。
2条答案
按热度按时间a1o7rhls1#
shared_ptr
只是一个指向数据的指针。你不是在交换数据本身,而是在交换指针。让我们一步一步来看看:
在这些语句之后,您有两个指向两个单独分配的
int
的指针:然后,该语句创建
abc
,使其指向foo
所指向的同一个已分配的int
。所以,在交换之前,你现在有:然后,交换
foo
和bar
持有的指针,但将abc
中的指针单独保留。所以,在交换之后,你现在有:这就是为什么
*foo
打印20,*bar
打印10,*abc
打印10。tktrz96b2#
当交换两个shared_ptr的内容时,.
这不是你的代码所做的。
std::swap(foo,bar)
交换指针。它不交换指针。如果你想交换内容,你需要交换内容:std::swap(*foo,*bar)
。事实上,它是智能指针,它实际上与您的代码无关。此外,动态分配没有太大变化,因此我们可以使用一个更简单的示例来说明:
到目前为止,有两个指针
a_ptr
和b_ptr
分别指向a
和b
。c_ptr
是a_ptr
的副本,也指向a
。交换
a_ptr
和b_ptr
后,现在a_ptr
指向b
,b_ptr
指向a
。第三个指针c_ptr
不受此影响。它仍然指向a
。a
和b
也没有修改。输出将是:
就像你的代码一样。