文档章节

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
粉丝 12
博文 162
码字总数 136638
作品 0
武汉
程序员
001-EMC 深入解读-目录

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

--Allen--
09/15
0
0
make && make install

使用eclipse 创建C++项目,daemon service 程序。 编译时,eclipse自动生成的makefile: ################################################################################ # Automatical......

JORDANSG
2012/12/11
0
0
Error list iterator not incrementable

Container Traverse for(iterator it = begin(); it != end(); ++it) for(iterator it = begin(); it != end(); it++) 两种方式iterator遍历的次数是相同的,但在STL中效率不同,前++--返回引......

nao
2014/04/11
0
0
【2018.08.13 C与C++基础】C++语言的设计与演化读书笔记

先占坑 老实说看这本书的时候,有很多地方都很迷糊,但却说不清楚问题到底在哪里,只能和Effective C++联系起来,更深层次的东西就想不到了。 链接: https://blog.csdn.net/cloudqiu/artic...

waitingdeng
08/21
0
0
JSON for Modern C++ 3.2.0 发布,C++ JSON 库

JSON for Modern C++ 3.2.0 已发布,此版本引入了 SAX 接口。虽然这可能只是少数人使用的一个非常特殊的功能,但它允许统一所有消耗输入并创建某种 JSON 值的函数。 此外,新版支持从宽字符串...

局长
08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
3
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部