当前位置:   article > 正文

C++之智能指针std::shared_ptr简单总结_c++ 指针转std::shared_ptr

c++ 指针转std::shared_ptr

std::shared_ptr的主要作用如下:

1、智能指针主要的用途就是方便资源的管理,自动释放没有指针引用的资源。

2、使用引用计数来标识是否有多余指针指向该资源。(注意,shart_ptr本身指针会占1个引用)

可以用shared_ptr.use_count()函数查看这个智能指针的引用计数,一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除

  1. #include <iostream>
  2. #include <memory>
  3. #include <string>
  4. using namespace std;
  5. class Student : public enable_shared_from_this<Student>
  6. {
  7. public:
  8. Student() {}
  9. ~Student()
  10. {
  11. std::cout << "~Student被调用" << std::endl;
  12. }
  13. std::shared_ptr<Student> getStudent()
  14. {
  15. return shared_from_this();
  16. }
  17. std::string name;
  18. void setName(std::string name);
  19. std::string getName();
  20. };
  21. void Student::setName(std::string name)
  22. {
  23. this->name = name;
  24. }
  25. std::string Student::getName()
  26. {
  27. return name;
  28. }
  29. int main()
  30. {
  31. int *p = new int(10);
  32. //std::shared_ptr<int> ptr = p;这样赋值是错误的额,只要是智能指针,这样直接用=赋值是有问题的必须std::shared_ptr<int> ptr(p);
  33. std::shared_ptr<int> ptr(p);
  34. std::shared_ptr<int> ptr1 = std::make_shared<int>(15);
  35. std::shared_ptr<int> ptr2(ptr1);
  36. //std::shared_ptr<int> ptr2 = ptr1;这样赋值是错误的,只要是智能指针,这样直接用=赋值是有问题的必须std::shared_ptr<int> ptr2(ptr1);
  37. std::cout << "ptr.use_count() is:" << ptr.use_count() << " *ptr is:" << *ptr << std::endl;
  38. std::cout << "ptr1.use_count() is:" << ptr1.use_count() << " *ptr1 is:" << *ptr1 << std::endl;
  39. std::cout << "ptr2.use_count() is:" << ptr2.use_count() << " *ptr2 is:" << *ptr2 << std::endl;
  40. ptr2.reset();
  41. //这是时候ptr2已经销毁,指向的对象引用计数会减1,这个指针的不再指向任何对象,所以我们不能使用*ptr2了,下面一行代码使用肯定会报错,我先注释掉
  42. //std::cout << "ptr2.use_count() is:" << ptr2.use_count() << "*ptr2 is:" << *ptr2 << std::endl;
  43. std::cout << "ptr1.use_count() is:" << ptr1.use_count() << " *ptr1 is:" << *ptr1 << std::endl;
  44. Student *stu = new Student();
  45. std::shared_ptr<Student> ptr_stu(stu);
  46. std::string name = "11";
  47. ptr_stu->setName(name);
  48. std::string result = ptr_stu->getName();
  49. std::cout << "ptr_stu.use_count() is:" << ptr_stu.use_count() << std::endl;
  50. std::cout << "my name is:"<<result<< std::endl;
  51. return 0;
  52. }

输出结果:

其中reset函数当智能指针调用了reset函数的时候,就不会再指向这个对象了,所以如果还有其它智能指针指向这个对象,那么另外一个智能指针的use_count()函数结果会减1。

为什么要用到enable_shared_from_this和shared_from_this,比如我们写一个普通的类,有析构函数,一个智能指针指向类对象的时候,我们析构函数会析购一次,然后智能指针会析构一次,析构两次就有问题

对enable_shared_from_this的说明可参考下面的文章:

https://blog.csdn.net/caoshangpa/article/details/79392878

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/51385
推荐阅读
相关标签
  

闽ICP备14008679号