以下示例均参考:c++智能指针

1> 类内部管理指针的方式实现资源的自动管理:

  1. #include <iostream>
  2. using namespace std;
  3. /*
  4. 简单的智能指针类, 析构函数中回收指针内存
  5. */
  6. template<typename T>
  7. class Auto_ptr1
  8. {
  9. public:
  10. Auto_ptr1(T* ptr = nullptr):
  11. m_ptr(ptr)
  12. {}
  13. /* 析构函数中回收内存 */
  14. virtual ~Auto_ptr1()
  15. {
  16. delete m_ptr;
  17. }
  18. T& operator*() { return *m_ptr; }
  19. T* operator->() { return m_ptr; }
  20. private:
  21. T* m_ptr;
  22. };
  23. /* 定义类用于初始化智能指针类 */
  24. class Resource
  25. {
  26. public:
  27. Resource() { cout << "Resource acquired!" << endl; }
  28. virtual ~Resource() { cout << "Resource destoryed!" << endl; }
  29. };
  30. void TestResource()
  31. {
  32. {
  33. Auto_ptr1<Resource> res(new Resource);
  34. }
  35. // cin.ignore(10);
  36. }
  37. // 打印:
  38. /*
  39. Resource acquired!
  40. Resource destoryed!
  41. */

上面所示例子完美地展示了通过类内部维护指针对象的方式管理内存,但是这样的写法也是有隐患的:

2> 智能指针对象初始化的隐患

  1. int main()
  2. {
  3. {
  4. Auto_ptr1<Resource> res1(new Resource);
  5. Auto_ptr1<Resource> res2(res1);
  6. }
  7. cin.ignore(10);
  8. return 0;
  9. }

这里我们使用 res1 去初始化 res2,这样就会触发默认拷贝构造函数,执行一个浅拷贝,即 res1 与 res2 内部保存的是同一块内存,当触发析构函数时,销毁的也是同一个指针对象,导致程序崩溃

3> 智能指针对象作为函数实参传递的隐患

  1. void passByValue(Auto_ptr1<Resource> res)
  2. {}
  3. int main()
  4. {
  5. {
  6. Auto_ptr1<Resource> res1(new Resource);
  7. passByValue(res1);
  8. }
  9. return 0;
  10. }

传递给 passByValue,也会触发一次拷贝构造函数,发生浅拷贝,在销毁 res1 的时候,又回去释放同一块内存,程序崩溃。