zoukankan      html  css  js  c++  java
  • 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()
        
    • 智能指针使用规则:只能用来指向堆空间中的单个对象或者变量

  • 相关阅读:
    DirectX11--实现一个3D魔方(2)
    DirectX11--实现一个3D魔方(1)
    DirectX11 With Windows SDK--25 法线贴图
    DirectX11--ComPtr智能指针
    DirectX11--教程项目无法编译、运行的解决方法
    DirectX11--HR宏关于dxerr库的替代方案
    DirectX11--HLSL编译着色器的三种方法
    一封来自恶魔的挑战邀请函,那些你见过或者没见过的C语言指针都在这里了
    DirectX11 With Windows SDK--24 Render-To-Texture(RTT)技术的应用
    DirectX11 With Windows SDK--23 立方体映射:动态天空盒的实现
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13623780.html
Copyright © 2011-2022 走看看