• 【C++】智能指针简述(六):智能指针总结及补充


      本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的shared_ptr删除器部分的内容.

    总结:

      1.智能指针,通过RAII机制,构造对象时完成资源的初始化,析构对象时,对资源进行清理和汕尾.

      2.auto_ptr,防止拷贝/赋值对象后,析构时多次delete对象导致程序崩溃,因此它通过“转移所有权”,完成赋值/拷贝,保证只有一个对象维护、释放指针.实际开发中,并不常用.

      3.scoped_ptr与auto_ptr类似,只是它不会“转移所有权”,而是禁止对象的拷贝/赋值.(把拷贝构造函数、赋值运算符重载设为private,并且只给出声明,不提供定义)

      4.shared_ptr,通过引用计数来管理指针,当出现新对象维护同一块指针时,引用计数增加.当引用计数为1时,才真正的delete指针.

      5.weak_ptr,解决shared_ptr循环引用的问题,与shared_ptr一起使用,不能单独使用.

    补充:shared_ptr定制删除器

      通过前文,我们已经知道shared_ptr是比较实用的智能指针.

      我们可以通过非常简洁的语句管理指针:

    #include<iostream>
    #include<memory>
    using namespace std;
    int main(){
    	shared_ptr<int> sp1(new int(10));
    	cout<<*sp1<<endl;
    	*sp1 = 20;
    	cout<<*sp1<<endl;
            return 0;
    }
    

      对于我们动态申请的内存,构造时完成初始化,析构时通过delete来释放没有任何问题.

      但,倘若是一个文件类型的指针呢?

    #include<iostream>
    #include<memory>
    using namespace std;
    int main(){
    	shared_ptr<FILE> sp1(fopen("test.txt","w"));
    	//如果不进行任何特殊处理,则程序崩溃!
    	return 0;
    }
    

      因此,shared_ptr提供了删除器功能,我们可以通过定制删除器,来对特定的资源进行回收.

    #include<iostream>
    #include<memory>
    using namespace std;
    
    //仿函数
    struct Fclose{
    	void operator()(void *ptr){
    		fclose((FILE*)ptr);
    		cout<<"不用担心,shared_ptr已经通过调用我关闭了文件!"<<endl;
    	}
    };
    
    int main(){
    	//我们通过传入仿函数,来完成对文件指针的清理
    	shared_ptr<FILE> sp1(fopen("test.txt","w"),Fclose());
    	return 0;
    }
    

      至此,定制shared_ptr删除器部分到这里就已经完美收官了!

      那么,智能指针部分到这里就告一段落了....感谢阅读!

  • 相关阅读:
    Netty源码解析与实战
    什么是序列化id?
    关于idea下tomcat输出日志的问题
    利用jstack 找到异常代码
    mysql 异常 Lock wait timeout exceeded; try restarting transaction;expc=java.sql.SQLExcept
    Spark-Hadoop、Hive、Spark 之间是什么关系?(转)
    转(数据分析的意义)
    按位取反~100=-101
    知识总汇
    前端(以Vue为例)webpack打包后dist文件包如何部署到django后台中
  • 原文地址:https://www.cnblogs.com/qq329914874/p/6662309.html
Copyright © 2020-2023  润新知