一些结论

  • 如果 shared_ptr 管理的资源不是 new 分配的内存,才考虑自定义删除器,这也是为什么 make_shared 不支持自定义删除器的原因,因为 make_shared 就是通过 new 分配内存资源
  • make_shared 不支持自定义删除器
  • shared_ptr<Bar> sp2(sp1, deleter1); 无法指定自定义删除器
    • 《C++ Primer 5th》P413 错误?
    • sp1 不能是 shared_ptr,可以是内置指针
  • reset() 参数为空或为内置指针,可以重新指定删除器
  • 顺便说一下,C++11 只有 make_shared,C++14 加入了 make_unique

测试代码

class Bar {
public:
Bar(int ii) : i(ii) { cout << "Bar(" << i << ")" << endl; }
~Bar() { cout << "~Bar(" << i << ")" << endl; }
int i;
}; void deleter1(Bar* b) { cout << "deleter1 (" << b->i << ")" << endl; } int main() {
shared_ptr<Bar> sp1(new Bar(1), deleter1);
auto sp2 = sp1; // OK
// shared_ptr<Bar> sp2(sp1, deleter1); // 编译错误!
cout << endl;
sp1.reset(new Bar(2)); // 可以重新指定其他 deleter // 先析构 sp2--> Bar1 ,再析构 sp1 --> Bar2
}

运行结果

Bar(1)

Bar(2)
deleter1 (1)
~Bar(2)

shared_ptr 自定义 deleter 删除器的更多相关文章

  1. C++几个技巧:智能指针在消息传递中的使用,元组,及lambda删除器

    1.SendMessage/PostMessage中传递对象参数 (1)方法1:使用shared_ptr 发送端: PostMessage(MyhWnd, CWM_SOME_ERROR, 0, rei ...

  2. RALL资源获取初始化,删除器

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. angularjs1 自定义图片查看器(可旋转、放大、缩小、拖拽)

    笔记: angularjs1 制作自定义图片查看器(可旋转.放大.缩小.拖拽) 2018-01-12 更新  可以在我的博客  查看我 已经封装好的 纯 js写的图片查看器插件    博客链接 懒得把 ...

  4. .net core Blazor+自定义日志提供器实现实时日志查看器

    场景 我们经常远程连接服务器去查看日志,比较麻烦,如果直接访问项目的某个页面就能实时查看日志就比较奈斯了,花了1天研究了下.net core 日志的原理,结合blazor实现了基本效果. 实现原理 自 ...

  5. SpringMVC 自定义一个拦截器

    自定义一个拦截器方法,实现HandlerInterceptor方法 public class FirstInterceptor implements HandlerInterceptor{ /** * ...

  6. iOS开发——UI进阶篇(四)tableView的全局刷新,局部刷新,左滑操作,左滑出现更多按钮,进入编辑模式,批量删除,自定义批量删除

    首先创建项目,在storyboard如下布局控件,设置好约束 然后创建cell模型类XMGWineCell数据模型类XMGWine创建UITableView,设置数据源协议,实现数据源方法懒加载数据这 ...

  7. 使用VideoView自定义一个播放器控件

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...

  8. Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例

    利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...

  9. Mybatis自定义SQL拦截器

    本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...

  10. SpringMVC自动封装List对象 —— 自定义参数解析器

    前台传递的参数为集合对象时,后台Controller希望用一个List集合接收数据. 原生SpringMVC是不支持,Controller参数定义为List类型时,接收参数会报如下错误: org.sp ...

随机推荐

  1. fatal: 无法访问 'https://github.com/nmww/lingyun.git/':Failed to connect to github.com port 443 after 13 ms: Connection refused

    fatal: 无法访问 'https://github.com/nmww/lingyun.git/':Failed to connect to github.com port 443 after 13 ...

  2. Cython加密python代码防止反编译

    本方法适用于Linux环境下: 1.安装库Cython pip3 install Cython==3.0.0a10 2.编写待加密文件:hello.py import random def ac(): ...

  3. python包引用方式总结

    本文为博主原创,转载请注明出处: 在Python中,有多种引用包的方式.以下是常见的方式: 1. import语句 import语句是最常见和推荐的引用包的方式.它允许你引入整个包或包中的特定模块/子 ...

  4. Chromium Canvas工作流

    blink 中实现了2种 canvas,分别是 blink::HTMLCanvasElement 和 blink::OffscreenCanvas ,前者对应 html/dom 中的 canvas,后 ...

  5. 美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?

    这是一道面试中常见的 Redis 基础面试题,主要考察求职者对于 Redis 应用场景的了解. 即使不准备面试也建议看看,实际开发中也能够用到. 内容概览: Redis 除了做缓存,还能做什么? 分布 ...

  6. Vue源码学习(十四):diff算法patch比对

    好家伙, 本篇将会解释要以下效果的实现 1.目标 我们要实现以下元素替换的效果 gif:   以上例子的代码: //创建vnode let vm1 = new Vue({data:{name:'张三' ...

  7. AtCoder Beginner Contest 326 (ABC326)

    A. 2UP3DOWN 直接模拟即可. Code B. 326-like Numbers 枚举,每次拆除百.十.个位,再判断. Code C. Peak Description 数字线上放置了 \(N ...

  8. 实现MyBatisPlus自定义sql注入器

    目标:新增mysql下的 插入更新的语法 INSERT INTO %s %s VALUES %s ON DUPLICATE KEY UPDATE %s 新增方法类,新增的方法名称为insertOrUp ...

  9. UVA529 加成序列

    传送门 题目分析 一道 dfs,迭代加深 我们可以很快的猜出来最终 \(m\) 的长度必然是小于 \(10\) 的. 而这种浅深度的问题正好适用于迭代加深. 之后考虑剪枝 优化搜索顺序 : 我们要让序 ...

  10. BFS广搜小谈

    个人认为BFS比DFS难度要大一些,所以来这里做个笔记. 比较可怜的是本蒟蒻并没有找到BFS这个东西解题有什么规律,所以我只能粘上3个代码. 模板 当然一个差不多点儿的模板还是要有的. //模板1 # ...