1. 首页
  2. c++

你好,C++(81)12.2.5 对shared_ptr的释放行为进行自定义

想要抢先看后面的章节?打赏本文10元,即可获得带插图全本下载地址!打赏完成记得私信我哦 :p

12.2.5 对shared_ptr的释放行为进行自定义

有时候,使用shared_ptr管理某些特别的资源时,它们的释放不是简单地使用delete操作符释放内存资源就可以完成的,还有可能需要一些额外的清理工作。在这种情况下,就需要对shared_ptr的释放行为进行自定义以完成特殊的释放清理工作。

shared_ptr所管理的资源的释放工作都是由它的删除器(deleter)来完成的。shared_ptr提供了一个可以接收某个函数指针(或函数对象)为参数的特殊的构造函数,通过这个构造函数,我们可以指定这个函数作为shared_ptr的删除器,从而让我们有机会通过这个函数对shared_ptr的释放工作进行自定义:

// shared_ptr带删除器参数的构造函数 template<class Other, class D> shared_ptr(Other * ptr, D dtor);

其中,第一个参数指向shared_ptr将要对其进行管理的某个资源(这里不再仅仅是内存资源,也有可能是程序中的其他共享资源,比如某个文件);第二个参数则是负责释放这个资源的函数,也被称为shared_ptr的删除器。当shared_ptr所管理资源的引用计数变为0时,它就会以指向这个资源的指针作为参数来调用这个函数,以此来完成资源的释放清理工作。这对于shared_ptr管理那些不是用new申请也不是用delete释放的非内存资源时非常有用。例如,我们需要在程序的多个过程中共享某个日志文件,而这个文件又没有一个明确的所有者,为了保证文件在最后能够被正确关闭,我们决定用shared_ptr来管理这个文件资源:

#include <fstream> #include <memory>   using namespace std; // 负责shared_ptr释放工作的函数 // 其参数类型为指向shared_ptr所管理资源的指针 void CloseFile(ofstream* pLogFile) {  // 完成额外的清理工作 (*pLogFile)<<"日志文件结束"<<endl; // 输出文件结束信息   pLogFile->close(); // 关闭文件   delete pLogFile; // 释放内存资源 } // 某个需要记录日志的函数 void foo(shared_ptr<ofstream> spLogFile) {   // 通过shared_ptr管理的文件输出日志 (*spLogFile)<<"foo()函数被调用"<<endl; }   int main() {  // 创建一个日志文件并交由shared_ptr进行管理 // 同时指定这个资源的释放工作由CloseFile()函数完成   shared_ptr<ofstream> spLogFile(new ofstream("log.txt"),CloseFile);   // 通过shard_ptr访问它所管理的日志文件以记录日志 (*spLogFile)<<"main()函数被调用"<<endl;  // 将shared_ptr传递给foo()函数供其记录日志   foo(spLogFile);     return 0; // 到这里,所有指向日志文件的shared_ptr都结束其生命周期, // 日志文件的引用计数变为0,CloseFile()函数被调用以完成释放工作 }

在这段代码中,我们在创建shared_ptr对ofstream对象进行管理的同时,提供一个CloseFile()函数作为其删除器。当ofstream对象的引用计数变为0时,shared_ptr就会以指向这个ofstream对象的指针为参数调用这个函数来完成资源的释放工作。这里对ofstream对象的释放,不仅仅是用delete操作符释放内存资源,在这之前,我们还向日志文件中输出了表示日志文件结束的信息,然后使用它的close()成员函数关闭了日志文件,最后才是用delete操作符释放内存。

通过对shared_ptr释放行为的自定义,使得它可以用于管理程序中任何的共享资源,比如内存资源、文件或者网络连接等。与通过普通指针在多个过程中共享资源相比,shared_ptr是会有那么一点点空间和性能上的损失,但是跟它所带来的共享资源的安全释放相比,这一点点的损失就微不足道了。当我们的程序比较复杂,而我们又需要在程序的多个过程之间共享资源,且这些共享资源又没有一个明确的所有者的时候,用shared_ptr来对共享资源进行管理是一个性价比很高的解决方案。

原文始发于:你好,C++(81)12.2.5 对shared_ptr的释放行为进行自定义

主题测试文章,只做测试使用。发布者:杀手梦三刀,转转请注明出处:http://www.cxybcw.com/7609.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code