在陈硕所著的<<Linux多线程服务端编程:使用muduo c++网络库>>一书1.19节中,介绍了c++的shared_ptr的函数swap和reset的用法。本文通过两个小程序示例这两个程序各自的作用。
swap()
代码:
#include <memory>
#include <iostream>
class Bar { public: ~Bar(){ std::cout << "destroying"; } };
int main(void)
{
auto sp1 = std::make_shared<Bar>();
std::shared_ptr<Bar> sp2;
auto sp3 = sp1;
std::cout << "initially, sp1.count = " << sp1.use_count() << ",sp2.count = " << sp2.use_count() << ",sp3.count = " << sp3.use_count()<<std::endl;
sp1.swap(sp2);
std::cout << "after swapping, sp1.count = " << sp1.use_count() << ",sp2.count = " << sp2.use_count() << ",sp3.count = " << sp3.use_count() << std::endl;
std::cin.get();
return 0;
}
效果:
可见,交换之后,sp3的计数不受影响。而sp1归零,sp2的计数变成了sp1原来的计数。且bar在swap前后都没有析构。(destroying没有打印)
reset()
代码:
#include <memory>
#include <stdio.h>
class Foo
{
public :
~Foo()
{
printf("instance destroyed\n");
}
};
int main(void)
{
auto sp1 = std::make_shared<Foo>();
auto sp2 = sp1;
printf("initially, sp1.count = %d, sp2.count = %d\n", sp1.use_count(), sp2.use_count());
sp1.reset();
printf("reseting sp1, now sp1.count = %d, sp2.count = %d\n", sp1.use_count(), sp2.use_count());
char c;
scanf("%c", &c);
return 0;
}
效果:
可见,reset将sp1的计数变为0。sp2计数减一,但sp2没有清零。