• 【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删除器部分到这里就已经完美收官了!

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

  • 相关阅读:
    餐饮点菜控件
    数据模块池
    关于sqlite数据库
    PHP使用DateTime类做时间日期到字符串转换
    php字符串比较函数
    Xdebug开源PHP程序调试器
    ubuntu chmod 无法更改 文件夹权限 系统提示“不允许的操作 2、linux 如何修改只读文件 3、ubuntu安装
    ubuntu的命令day1
    linux用终端上传文件和文件家到远程的服务器
    Symfony学习--原创。。。。
  • 原文地址:https://www.cnblogs.com/qq329914874/p/6662309.html
Copyright © 2020-2023  润新知