文档章节

Effective C++: user-defined deleter.

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/05/06 16:50
字数 257
阅读 60
收藏 0

std::shared_ptr与自定义deleter:

#include <iostream>
#include <memory>

class Deleter{
	public:
		Deleter()=default;
		~Deleter()=default;
		
		template<typename T, typename = 
		         typename std::enable_if<std::is_pointer<T>::value>::type>
		void operator()(T ptr)
		{
			if(ptr != nullptr){
				delete ptr;
			}
			
			std::cout<< "success!" << std::endl;
		}
};

template<typename T, typename =
         typename std::enable_if<std::is_pointer<T>::value>::type>
void deleter(T ptr)
{
	if(ptr != nullptr){
		delete ptr;
	}
	
	std::cout<< "success" << std::endl;
}
         

int main()
{
	//case 1:
	std::shared_ptr<int> p1(new int(20), Deleter());
	
	//case 2:
	std::function<void (int*)> deleterOne = std::bind(Deleter(), std::placeholders::_1);
	std::shared_ptr<int> p2(new int(30), deleterOne);
	
	//case 3:
	std::shared_ptr<int> p3(new int(40), deleter<int*>);
	
	//case 4:
	std::shared_ptr<int> p4(new int(50), [](int* ptr){ delete ptr; });
	
	
	return 0;
}

std::unique_ptr与自定义deleter:

#include <iostream>
#include <memory>
#include <functional>

class Deleter{
	public:
		Deleter()=default;
		~Deleter()=default;
		
		template<typename T, typename = 
		         typename std::enable_if<std::is_pointer<T>::value>::type>
		void operator()(T ptr)
		{
			if(ptr != nullptr){
				delete ptr;
			}
		}
};

template<typename T, typename = 
         typename std::enable_if<std::is_pointer<T>::value>::type>
void deleter(T ptr)
{
	if(ptr != nullptr){
		delete ptr;
	}
}

int main()
{
	//case 1:
	std::unique_ptr<int, Deleter> up1(new int, Deleter());
	
	//case 2:
	std::unique_ptr<int, std::function<void (int*)>> up2(new int, deleter<int*>);
	
	//case 3;
	std::unique_ptr<int, std::function<void (int*)>> up3(new int, [](int* ptr){ delete ptr; });
	
	//case 4:
	std::unique_ptr<int, std::function<void (int*)>> up4(new int, std::bind(Deleter(), std::placeholders::_1));
	
	
	return 0;
}

 

© 著作权归作者所有

共有 人打赏支持
SHIHUAMarryMe
粉丝 13
博文 164
码字总数 138212
作品 0
武汉
程序员
私信 提问
C++ 对象资源管理惯用法

原文:C++ 对象资源管理惯用法 作者:Breaker 关于 C++ 对象资源管理的惯用法,note-to-self + keynote + idiom case + cross-reference 式笔记 keyword: RAII, deleter, Two-stage Initiali...

晨曦之光
2012/05/23
147
0
__STDC_LIMIT_MACROS 和 __STDC_CONSTANT_MACROS

Question: I see this in the standard C++ libraries for my system, as well as some of the headers in a library I'm using. What are the semantics of these two definitions? Is ther......

长平狐
2013/03/04
1K
0
C++各阶段学习书目

1. 入门 Lippman的《Essential C++》 顾名思义,这本书是很短小精悍的。通过这本书,可以对C++的最常用和重要的特性有全面的了解,并对C++的全貌有一个概念。虽然这远远不够,但就是这样的书...

晨曦之光
2012/04/24
301
1
Clang 3.1 发布,支持 C++11

Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。 Clang 3.1 支持匿名结构和匿名 union,可使用 =std...

oschina
2012/05/23
3.6K
14
001-EMC 深入解读-目录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1007729991/article/details/82717008 除了刚毕业的应届生,从来没人敢说他精通 C++,Bjarne Stroustrup (C...

--Allen--
09/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
3
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部