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

  • 相关阅读:
    Windows 7下 搭建 基于 ssh 的sftp 服务器
    理解ThreadLocal(二)
    理解ThreadLocal(一)
    Putty使用公钥认证时,报错:Disconnected: No supported authentication methods available(server sent:public key) 问题的解决
    SFTP信任公钥配置及JSCH库
    怎样在WIN7系统下安装IIS
    深入研究B树索引(一)
    【转】EntityFramework(EF)贪婪加载和延迟加载的选择和使用
    【转】Ext JS 集合1713个icon图标的CSS文件
    [转]ASP.NET MVC 4 最佳实践宝典
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13623780.html
Copyright © 2020-2023  润新知