《我的都一本c++书》学习笔记:STL之shared_ptr(下)

在有些情况下,使用shared_ptr管理某些特别的类型时,这些特别的类型对象的释放不是简单地使用delete关键字释放就可以完成的,需要对shared_ptr进行自定义以完成特殊的清理工作。

shared_ptr所管理的资源的清理工作都是由删除器(deleter)来完成的。shared_ptr提供了一些特殊的构造函数,这些构造函数可以指定shared_ptr删除器,从而对shared_ptr的清理工作进行自定义。

     template< class Other,  class  D >  shared_ptr(Other  *   ptr,    D   dtor );

这个构造函数带有两个参数。

第一个参数表示:shared_ptr将要获得所有权的某个资源;

第二个参数表示:shared_ptr被销毁时负责释放资源的一个对象,它称之为删除器。当shared_ptr的引用计数变为0时被调用,被保存的资源将以dtor(ptr)的形式传给删除器;


当清理一个文件对象时,往往不是使用delete操作符释放对象,而是使用相应的成员函数关闭文件。


// 2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <memory>
#include <time.h>

using namespace std;


class FileCloser
{
public:
	//重载“()”操作符
	void operator () (FILE* pFile)
	{
		if ( NULL != pFile )
		{
			fprintf( pFile, "日志文件结束\n" );

			cout<<"关闭日志文件"<<endl;

			fclose(pFile);
		}
	}
};

//向日志文件打印系统时间
void PrintTime( shared_ptr<FILE> spLog )
{
	char tmpbuf[128];
	_strtime_s( tmpbuf, 128);
	fprintf( spLog.get(), "当前系统时间:\t\t%s\n", tmpbuf);
}

//向日志文件打印系统日期
void PrintDate( shared_ptr<FILE> spLog )
{
	char tmpbuf[128];
	_strdate_s( tmpbuf, 128 );
	fprintf( spLog.get(), "当前系统日期为:\t\t%s\n", tmpbuf );
}

int _tmain(int argc, _TCHAR* argv[])
{
	FILE* fLog = NULL;
	int err = fopen_s(&fLog, "C:\\Users\\sony\\Desktop\\practice\\log.txt", "w");

	if ( 0 == err )
	{
		cout<<"打开日志文件并写入日志"<<endl;
		shared_ptr<FILE> spLog( fLog, FileCloser());

		fprintf( spLog.get(), "日志文件开始\n" );

		PrintTime(spLog);
		PrintDate(spLog);
	}
        //当通过shared_ptr访问资源时,需要对shared_ptr使用&或者get()函数来获得它所管理的指针
	return 0;
}

注意的是如果在释放资源时,只需要调用一个单参数函数,可以直接传递给shared_ptr的构造函数这个删除函数的指针即可。

如:

      shared_ptr<FILE> spLog( fLog, &fclose );

一样能实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::shared_ptrC++标准库中的一个智能指针类,用于管理动态分配的资源。它具有引用计数机制,可以实现多个指针共享同一个对象的所有权。 在给std::shared_ptr赋值时,有三种方式可以使用: 1) 拷贝赋值:使用一个std::shared_ptr初始化另一个std::shared_ptr,这将导致引用计数加1。 2) 移动赋值:使用std::make_shared或者直接赋值一个临时创建的std::shared_ptr,这将导致原来的std::shared_ptr失去对资源的所有权,引用计数转移。 3) 使用std::move:将一个std::unique_ptr移动给std::shared_ptr,这将导致原来的std::unique_ptr失去对资源的所有权,引用计数转移。 对于std::shared_ptr的成员函数功能,具体可以参考STL的文档或笔记。 关于std::shared_ptr的初始化,当使用裸指针初始化std::shared_ptr时,如果指针为nullptr,则std::shared_ptr的_M_ptr和_M_refcount都将为nullptr;否则,将分配内存并初始化控制块。 所以,std::shared_ptr可以用于管理动态分配的资源,并且可以共享资源的所有权。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [std::shared_ptr 详解](https://blog.csdn.net/baidu_31541363/article/details/95802210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [[STL] std::shared_ptr笔记](https://blog.csdn.net/weixin_38734472/article/details/126486549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值