c++ 是否需要重置在函数(局部变量)中初始化的shared_ptr对象?和全局文件?

kmb7vmvb  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(126)

初始化全局静态shared_ptr对象并传递给函数:

  1. #include <iostream>
  2. #include <memory>
  3. std::shared_ptr<int> globalObj = std::make_shared<int>(5);
  4. int testFunc(std::shared_ptr<int> obj1) {
  5. std::shared_ptr<int> localObj = obj1;
  6. std::cout<<"localObj.count:" << localObj.use_count() << std::endl;
  7. std::cout << "localObj:" << *localObj <<std::endl;
  8. localObj.reset(); -->** is it necessary to reset local count??**
  9. std::cout<<"localObj.count:" << localObj.use_count() << std::endl;
  10. return 0;
  11. }
  12. int main()
  13. {
  14. std::cout<<"globalObj.count:" << globalObj.use_count() << std::endl;
  15. std::cout <<"globalObj:" << *globalObj <<std::endl;
  16. testFunc(globalObj);
  17. std::cout<<"globalObj.count:" << globalObj.use_count() << std::endl;
  18. std::cout <<"globalObj:" << *globalObj <<std::endl;
  19. globalObj.reset(); --> **is it necessary to reset global count??**
  20. std::cout<<"globalObj.count:" << globalObj.use_count() << std::endl;
  21. return 0;
  22. }
  1. globalObj.count:1
  2. globalObj:5
  3. localObj.count:3
  4. localObj:5
  5. localObj.count:3
  6. globalObj.count:1
  7. globalObj:5
  8. globalObj.count:1

reset()是否会影响C++程序的效率?

wr98u20j

wr98u20j1#

没有必要重置,没有。
智能指针的目标:unique_ptrshared_ptrweak_ptr是通过RAII概念自动释放内存。
因此,释放智能指针在99.9%的情况下是毫无意义的。
下面是一个代码示例,但很少说明:

  1. #include <iostream>
  2. #include <memory>
  3. class MyInt;
  4. auto globalObj = std::make_shared<MyInt>(5);
  5. class MyInt final
  6. {
  7. int intVal;
  8. public:
  9. MyInt()
  10. {
  11. std::cout << "Constucted!" << std::endl;
  12. }
  13. MyInt(int nv ): intVal(nv)
  14. {
  15. std::cout << "Constucted!" << std::endl;
  16. }
  17. operator int()
  18. {
  19. return intVal;
  20. }
  21. ~MyInt()
  22. {
  23. std::cout << "Destroyed!" << std::endl;
  24. }
  25. };
  26. int testFunc(const std::shared_ptr<MyInt>& obj1)
  27. {
  28. using std::cout;
  29. using std::endl;
  30. auto localObj = obj1;
  31. cout<<"localObj.count:" << localObj.use_count() << endl;
  32. cout << "localObj:" << *localObj << endl;
  33. return 0;
  34. }
  35. int main()
  36. {
  37. using std::cout;
  38. using std::endl;
  39. {
  40. cout<< "globalObj.count:" << globalObj.use_count() << endl;
  41. cout << "globalObj:" << *globalObj << endl;
  42. testFunc(globalObj);
  43. cout << "globalObj.count:" << globalObj.use_count() << endl;
  44. cout << "globalObj:" << *globalObj << endl;
  45. }
  46. return 0;
  47. }

输出:
被人欺负了!
globalObj.count:1
globalObj:5
localObj.count:2
localObj:5
globalObj.count:1
globalObj:5
毁了!
你可以在这里测试:https://onlinegdb.com/tXqnoysmT

展开查看全部

相关问题