文档章节

Effective C++: user-defined deleter.

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/05/06 16:50
字数 257
阅读 60
收藏 0
点赞 2
评论 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
博文 165
码字总数 138772
作品 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
C++预定义宏 C++ Predefined Macros

一、ANSI C标准预定义宏 LINE:在源代码中插入当前源代码行号; FILE:在源文件中插入当前源文件名; DATE:在源文件中插入当前的编译日期 TIME:在源文件中插入当前编译时间; STDC:当要求...

涩女郎
2015/08/25
0
0
C++ new 关键字的 "new" 学习

以前动态申请内存,申请完后,总要判断指针是否为空,比如 const unsigned int iSize = 102410241024*1.8;char *p = new char[iSize];if(!p){ return ; //异常处理} 一直觉得这样没什么问题(...

余青木
2015/03/26
0
0
C++ 对象资源管理惯用法

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

晨曦之光
2012/05/23
131
0
Reading UTF-8 with C++ streams

Introduction This article is about reading and writing Unicode to character streams in UTF-8 encoding. And as a consequence is about an often mis-known aspect of the C++ STL / I......

小熊猫大暴走
2012/04/26
0
0
Never Call Virtual Functions during Constructio...

代码 1. java class Bird { public Bird() {show();} public void show() {System.out.println("hey, I'm a bird.");}} class Eagle extends Bird {private String name = "littleEgale"; pu......

coda
2011/11/11
0
0
消灭“脑细胞杀手”,阿里专家带你深入C++对象的生命周期管理

摘要:C/C++的指针一直是令人又爱又恨的特性。围绕指针产生了许许多多优雅的数据结构和系统实现,但又滋生了不少“脑细胞杀手”——内存Bug。C/C++指针问题(空指针、野指针、垂悬指针)的根...

萌萌怪兽
04/18
0
0
C#调用C的Dll(类型对照)

C#调用C的DLL //C++中的DLL函数原型为 //extern "C" declspec(dllexport) bool 方法名一(const char 变量名1, unsigned char 变量名2) //extern "C" declspec(dllexport) bool 方法名二(cons......

KavenSu
2014/04/30
0
0
Effective C++ 笔记(1):视C++为语言联邦

条款一(clause 1) 将C++视为语言联邦:提出了一种将C++分为四种不同次语言的观念,四种次语言分别是: 1、C语言,面向过程的语言,C++完全向下兼容C,在C++中单纯使用C语言的语法除了遵守的一...

oldpan
2017/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
24分钟前
0
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
25分钟前
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
25分钟前
0
0
jq 判断复选框是否被选中,复选框后台接收

1. 效果 2. 代码 html部分: JS部分: var rememberLogin = $("#rememberLoginId").is(':checked')//获取复选框是否被选中 var rememberLoginval = $("#rememberLoginId").attr('value')//拿......

Lucky_Me
32分钟前
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
32分钟前
0
0
《趣谈网络协议》之为什么要学习网络协议?

一、协议 1.协议的定义 简单说协议就是一个规则,保证沟通交流双方可以互相听懂、理解或者可以双方合作可以顺利进行的一个约定和规则。 2.生活中例子 (1)有一种叫“程序猿”的物种,敲着一种...

aibinxiao
34分钟前
1
0
Python数据分析numpy基础-维度的认识

什么是多维数组? 核心对象是同型的多维数组(简单理解就是一个表格,通常内容都是些数字),具有相同的数据类型。 概念: 1. axes(轴):数组的维度统称为轴。 2. rank:轴的数量称为rank。...

十年磨一剑3344
38分钟前
0
0
Java 正则表达式相关资料

1.java正则表达式过滤html标签

IT追寻者
41分钟前
0
0
点赞出现数字变大效果

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .container{ padding: 50px; border: 1px solid #dddddd; } .item{ position: relative; } ......

南桥北木
今天
0
0
anroid中批量将px转换成dp

package com.qu;import java.io.File;import java.io.FileWriter;import java.io.IOException;public class Aaaa {public static void main(String[] args) {String fi......

android-key
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部