zoukankan      html  css  js  c++  java
  • 【C++】智能指针简述(一):智能指针的引入

      智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式.

      在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域程序异常退出之前,我们必须手动释放掉它,否则的话就会引起内存泄漏.

      例如:我们用指针变量来创建对象时,需要手动来删除它

    string * pstr = new string("hello world!");
    ....
    delete pstr;
    

      事实上,即使我们非常谨慎,但有时候的一些情况仍然会让我们防不胜防:

    //情况一:在程序某个分支内,忘记释放内存
    void FunTest1(){
    	int *pArr = new int[10];
    	FILE* pFile = fopen("test.txt","r");
    	if(pFile==NULL){
    		return ;
    	}
    	//.....
    	//处理其他代码
    	//.....
    	if(pArr!=NULL){
    		delete[] pArr;
    		pArr = NULL;
    	}
    }
    
    //情况二:当程序抛出异常时,忘记了释放内存
    void FunTest2(){
    	int *pArr = new int[10];
    	try{
    		//...
    		//其他代码
    		//...
    	}catch(...){
    		return ;
    	}
    	if(pArr!=NULL){
    		delete[] pArr;
    		pArr = NULL;
    	}
    }

      每次动态开辟内存,都要手动去释放,稍不留神,就会造成内存泄漏.(代码一多,逻辑一复杂,吓得我都不敢动态开辟内存了!)

      那么,我自然就傻傻地期望着:如果有一个什么东西可以管理指针,让它在出函数作用域时或者异常结束前自动释放内存,岂不是美滋滋?

      因此,我们引入RAII(资源的获取就是初始化)机制:通过类来封装指针,在构造函数中完成资源的初始化,在析构函数中完成资源的清理及汕尾工作.

      欲知后事如何,且听下回分解:智能指针详解之auto_ptr

  • 相关阅读:
    《NoSQL精粹》读书笔记
    react+flux编程实践(一) 基础篇
    MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引
    (译+注解)node.js的C++扩展入门
    深入解析Javascript异步编程
    (译)package.json详解
    Protobuf学习
    Redis学习
    MySQL学习-常用命令整理
    TCP/IP-TCP
  • 原文地址:https://www.cnblogs.com/qq329914874/p/6653412.html
Copyright © 2011-2022 走看看