当前位置:   article > 正文

C++ 智能指针

C++ 智能指针

 智能指针是针对内存泄漏的问题进行处理。

场景1

我们写一个模拟除法函数,调用一下。该函数会对除数为0的情况抛异常:

  1. #include<iostream>
  2. using namespace std;
  3. double chu(int a, int b)
  4. {
  5. if (b == 0)
  6. {
  7. throw invalid_argument("除数不能为0!");
  8. }
  9. else
  10. {
  11. return (double)a / b;
  12. }
  13. }
  14. void funb()
  15. {
  16. int* p = new int[10];
  17. int a = 0, b = 0; cin >> a >> b;
  18. cout << chu(a, b) << endl;
  19. delete[] p;
  20. cout << "deletc[]" << p << endl;
  21. }
  22. int main()
  23. {
  24. try
  25. {
  26. funb();
  27. }
  28. catch (const exception &e)
  29. {
  30. cout << e.what() << endl;
  31. }
  32. return 0;
  33. }

 抛异常不调用析构:

正常情况会释放:

 我们发现如果没有抛异常就程序最后释放(调用析构),如果抛异常了那么最后不会析构(不调用析构)。

那么如果遇到抛异常的情况,没有调用析构,最后可能会导致内存泄漏的问题。

这个时候就可以用聪明的指针来解决这个问题:

  1. #include<iostream>
  2. using namespace std;
  3. class SmartPtr
  4. {
  5. public:
  6. SmartPtr(int* ptr)
  7. :_ptr(ptr)
  8. {}
  9. ~SmartPtr()
  10. {
  11. delete[] _ptr;
  12. cout<<"delete[]"<< " "<< _ptr<<endl;
  13. }
  14. private:
  15. int* _ptr;
  16. };
  17. double chu(int a, int b)
  18. {
  19. if (b == 0)
  20. {
  21. throw invalid_argument("除数不能为0!");
  22. }
  23. else
  24. {
  25. return (double)a / b;
  26. }
  27. }
  28. void funb()
  29. {
  30. int* p = new int[10];
  31. SmartPtr sp(p);
  32. int a = 0, b = 0; cin >> a >> b;
  33. cout << chu(a, b) << endl;
  34. //delete[] p;
  35. //cout << "deletc[]" << p << endl;
  36. }
  37. int main()
  38. {
  39. try
  40. {
  41. funb();
  42. }
  43. catch (const exception &e)
  44. {
  45. cout << e.what() << endl;
  46. }
  47. return 0;
  48. }

 

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

闽ICP备14008679号