1 智能指针

1 内存泄漏问题

  • 动态申请堆空间,用完后不归还
  • C++语言中没有垃圾回收的机制
  • 指针无法控制所指堆空间的生命周期

2 智能指针

  • 指针生命周期结束时主动释放堆空间
  • 一片堆空间最多只能由一个指针标识
  • 杜绝指针运算和指针比较

3 智能指针的设计方案

  • 通过类模板描述指针的行为:能够定义不同类型的指针对象

  • 重载指针特征操作符(->*:利用对象模拟原生指针的行为

  • 示例:智能指针

    • Demo

      //SmartPointer.h
      #ifndef _SMARTPOINTER_H_
      #define _SMARTPOINTER_H_
      
      //声明一个命名空间:DTLib
      namespace DTLib
      {
      
      template <typename T>
      class SmartPointer
      {
      protected:
      	//成员变量:原生指针
      	T* m_pointer;
      public:
      	//构造函数:默认原生指针赋值为NULL
      	SmartPointer(T* p = NULL) {
      		m_pointer = p;
      	}
      
          
      	//一片堆空间最多只能由一个指针标识
      	//拷贝构造函数
      	SmartPointer(const SmartPointer<T>& obj) {
      		//将当前对象的成员指针指向obj对象指针所指向的堆空间
      		m_pointer = obj.m_pointer;
      		//将obj对象的指针置空,否则会有两个指针指向同一片堆空间
      		const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
      	}
          
      	//重载赋值操作符"=”
      	SmartPointer<T>& operator=(const SmartPointer<T>& obj) {
      		//首先判断是否自赋值
      		if (this != &obj) {
      			//释放当前对象的成员指针所指向的堆空间
      			delete m_pointer;
      			m_pointer = obj.m_pointer;
      			const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
      		}
      		//支持连续赋值
      		return *this;
      	}
      
          
      	//重载指针特征操作符
      	//"->":返回指针
      	T* operator->() {
      		return m_pointer;
      	}
          
      	//"*":返回指针所指向的内容
      	T& operator*() {
      		return *m_pointer;
      	}
      
          
      	//判断当前指针是否为空指针
      	bool isNull() {
      		return (m_pointer == NULL);
      	}
          
      	//获取指针
      	T* get() {
      		return m_pointer;
      	}
      
          
      	//析构函数:主动释放指针所指向的堆空间
      	~SmartPointer() {
      		delete m_pointer;
      	}
      };
      
      }
      
      #endif
      
    • 应用

      //main.cpp
      #include <iostream>
      #include "SmartPointer.h"
      using namespace std;
      using namespace DTLib;
      
      //创建测试类
      class Test
      {
      public:
      	Test() {
      		cout << "Test()" << endl;
      	}
      	~Test() {
      		cout << "~Test()" << endl;
      	}
      };
      
      int main()
      {
      	SmartPointer<Test> sp = new Test();
      
      	SmartPointer<Test> nsp;
          
      	nsp = sp;
          
      	cout << sp.isNull() << endl;  //0:sp为空
      	cout << nsp.isNull() << endl;  //1:nsp不为空
      
      	//nsp++;  // error : 没有与这些操作数匹配的 "++" 运算符
      
      	return 0;
      }
      
    • 编译运行

      Test()
      1
      0
      ~Test()
      
  • 智能指针使用规则:只能用来指向堆空间中的单个对象或者变量

posted @ 2020-09-06 21:37  nxgy  阅读(115)  评论(0编辑  收藏  举报