- shared_ptr 是一个标准的共享所有权的智能指针, 允许多个指针指向同一个对象. 定义在 memory
文件中(非memory.h), 命名空间为 std.
使用方法
- 可以使用模板函数 make_shared 创建对象, make_shared 需指定类型(’<>‘中)及参数(’()'内), 传递的参数必须与指定的类型的构造函数匹配. 如:
std::shared_ptr<int> sp1 = std::make_shared<int>(10);
std::shared_ptr<std::string> sp2 = std::make_shared<std::string>("Hello c++");
成员函数
- use_count 返回引用计数的个数
- unique 返回是否是独占所有权( use_count 为 1)
- swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
- reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少
- get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是一样的.如 shared_ptr sp(new int(1)); sp 与 sp.get()是等价的
例子:
std::shared_ptr<int> sp0(new int(2));
std::shared_ptr<int> sp1(new int(11));
std::shared_ptr<int> sp2 = sp1;
printf("%d\n", *sp0);
printf("%d\n", *sp1);
printf("%d\n", *sp2);
sp1.swap(sp0);
printf("%d\n", *sp0);
printf("%d\n", *sp1);
printf("%d\n", *sp2);
std::shared_ptr<int> sp3(new int(22));
std::shared_ptr<int> sp4 = sp3;
printf("%d\n", *sp3);
printf("%d\n", *sp4);
sp3.reset();
printf("%d\n", sp3.use_count());
printf("%d\n", sp4.use_count());
printf("%d\n", sp3);
printf("%d\n", sp4);
std::shared_ptr<int> sp5(new int(22));
std::shared_ptr<int> sp6 = sp5;
std::shared_ptr<int> sp7 = sp5;
printf("%d\n", *sp5);
printf("%d\n", *sp6);
printf("%d\n", *sp7);
printf("%d\n", sp5.use_count());
printf("%d\n", sp6.use_count());
printf("%d\n", sp7.use_count());
sp5.reset(new int(33));
printf("%d\n", sp5.use_count());
printf("%d\n", sp6.use_count());
printf("%d\n", sp7.use_count());
printf("%d\n", *sp5);
printf("%d\n", *sp6);
printf("%d\n", *sp7);
std::shared_ptr<int> sp1 = std::make_shared<int>(10);
std::shared_ptr<int> sp2 = std::make_shared<int>(11);
auto sp3 = sp2; 或 auto sp3(sp2);
printf("sp1.use_count = %d\n", sp1.use_count());
printf("sp2.use_count = %d\n", sp2.use_count());
printf("sp3.use_count = %d\n", sp3.use_count());
sp3 = sp1;
printf("sp1.use_count = %d\n", sp1.use_count());
printf("sp2.use_count = %d\n", sp2.use_count());
printf("sp3.use_count = %d\n", sp3.use_count());
参考文章:
https://www.cnblogs.com/diysoul/p/5930361.html