unique_ptr 指定删除器和 shared_ptr 指定删除器是有区别的,unique_ptr 指定删除器的时候需要确定删除器的类型,所以不能像 shared_ptr 那样直接指定删除器,举例说明:

代码如下:

#include <iostream>
#include <memory>
#include <string>
using namespace std;class Test
{public:Test(){cout << "construct" << endl;}Test(int x) :m_num(x){cout << "construct x = " << x << endl;}Test(string str){cout << "construct str = " << str << endl;}~Test(){cout << "destruct" << endl;}void setValue(int v){m_num = v;}void print(){cout << "m_num = " << m_num << endl;}private:int m_num;
};int main()
{using ptrFunc = void(*)(Test *);unique_ptr<Test,ptrFunc> ptr4(new Test("hello"), [](Test * t){cout << "------------------" << endl;delete t;});return 0;}

测试结果:

代码如下:

//error 捕获了外部变量的lambda表达式只能看做仿函数using ptrFunc = void(*)(Test *);unique_ptr<Test, ptrFunc> ptr4(new Test("hello"), [=](Test * t){cout << "------------------" << endl;delete t;});

上面的代码中错误原因是这样的,在 lambda 表达式没有捕获任何外部变量时,可以直接转换为函数指针,一旦捕获了就无法转换了,如果想要让编译器成功通过编译,那么需要使用可调用对象包装器来处理声明的函数指针:

#include <iostream>
#include <memory>
#include <string>
#include <functional>
using namespace std;class Test
{public:Test(){cout << "construct" << endl;}Test(int x) :m_num(x){cout << "construct x = " << x << endl;}Test(string str){cout << "construct str = " << str << endl;}~Test(){cout << "destruct" << endl;}void setValue(int v){m_num = v;}void print(){cout << "m_num = " << m_num << endl;}private:int m_num;
};int main()
{//error 捕获了外部变量的lambda表达式只能看做仿函数/*using ptrFunc = void(*)(Test *);unique_ptr<Test, ptrFunc> ptr4(new Test("hello"), [=](Test * t){cout << "------------------" << endl;delete t;});*///捕获了外部变量的lambda表达式只能看做仿函数,要把它包装才可以unique_ptr<Test,function<void(Test*)>> ptr4(new Test("hello"), [=](Test * t){cout << "------------------" << endl;delete t;});return 0;}

独占的智能指针可以管理数组类型的地址,能够自动释放。

代码如下:

int main()
{//独占的智能指针可以管理数组类型的地址,能够自动释放unique_ptr<Test[]> ptr4(new Test[3]);return 0;
}

测试结果:

[C++11]独占的智能指针unique_ptr的删除器相关推荐

  1. [C++11]独占的智能指针unique_ptr的初始化和使用

    std::unique_ptr 是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个 unique_ptr 赋值给另 ...

  2. C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

    目录 1.引言 2.什么是智能指针? 3.在Visual Studio中查看智能指针的源码实现 4.独占式指针unique_ptr 4.1.查看unique_ptr的源码实现片段 4.2.为什么uni ...

  3. [C++11]共享智能指针shared_ptr指定删除器

    当智能指针管理的内存对应的引用计数变为 0 的时候,这块内存就会被智能指针析构掉了.另外,我们在初始化智能指针的时候也可以自己指定删除动作,这个删除操作对应的函数被称之为删除器,这个删除器函数本质是一 ...

  4. 【C++】unique_ptr独占型智能指针详解

    指针是C/C++区别于其他语言的最强大的语法特性,借助指针,C/C++可以直接操纵内存内容.但是,指针的引入也带来了一些使用上的困难,这要求程序员自己必须手动地对分配申请的内存区进行管理. uniqu ...

  5. C++智能指针unique_ptr与shared_ptr

    文章目录 1.unique_ptr特点 2.unique_ptr例子 3.unique_ptr总结 4.shared_ptr特点 5.shared_ptr例子 6.shared_ptr中的自定义删除器 ...

  6. c++11 智能指针 unique_ptr、shared_ptr与weak_ptr

    C++11中有unique_ptr.shared_ptr与weak_ptr等智能指针(smart pointer),定义在<memory>中. 可以对动态资源进行管理,保证任何情况下,已构 ...

  7. C++11新特性——智能指针之unique_ptr

    此课件及源代码来自B站up主:码农论坛,该文章仅作为本人学习笔记使用. unique_ptr独享它指向的对象,也就是说,同时只有一个unique_ptr指向同一个对象,当这个unique_ptr被销毁 ...

  8. C++11 智能指针unique_ptr使用 -- 以排序二叉树为例

    http://www.cnblogs.com/fstang/p/3947552.html 用智能指针可以简化内存管理.以树为例,如果用普通指针,通常是在插入新节点时用new,在析构函数中调用delet ...

  9. c++ 智能指针_详解 C++ 11 中的智能指针

    C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念.这里不置贬褒,手动分配内存与手动释放内 ...

最新文章

  1. 第十一周总结CoreIDRAW
  2. linux烧录,新人求教,怎么烧录Linux系统到一个小芯片上?
  3. 网管日志-06.07.12
  4. OpenCV cv :: Mat的串行输出功能的实例(附完整代码)
  5. SQLServer常用的日期和时间函数梳理
  6. MATLAB学习——常用语句
  7. 表单和字都居中_APP 分享 | 6 款黑科技工具,低调收藏,每一款都很强大!
  8. springboot 远程调用shell脚本,环境为windows
  9. SAP License:SaaS的生门到底在哪里?
  10. win10安装solidworks 注册机闪退的问题,转自知乎
  11. 软件测试基本流程【车机测试】
  12. asp excel导入mysql_asp excel导入数据库
  13. 用计算机连接路由器,怎样连接路由器和电脑_电脑怎么链接路由器-系统城
  14. wps2022无法加载此加载项程序mathpage.wll
  15. 【2019年03月29日】股票的滚动市盈率PE最低排名
  16. win10同时安装wps和office时,如何设置默认应用为office!!!
  17. 5G UE — USIM Card
  18. 使用Foxmail定制自己的邮件模板
  19. 07_Numpy渐变图片的生成
  20. Spring Boot配置ssl证书

热门文章

  1. Android之CheckBox进行代码设置setChecked(true)会触发setOnCheckedChangeListener事件
  2. Java之volatile如何保证可见性和指令重排序
  3. Android启动过程五个步骤,Android启动流程、app启动原理
  4. 我的世界java版forge怎么用_我的世界电脑版MOD怎么用 我的世界pc版forge怎么安装...
  5. nx二次开发c语言,NX二次开发-UFUN API函数编程基础
  6. design短语的用法总结_design的意思、用法、搭配和例句
  7. php支持cs吗,关于composer、phpmd和phpcs于windows中的安装与使用方法
  8. 第一个发现我嫂子有喜的竟然是......
  9. 越来越多的人不刷朋友圈竟然是因为.....
  10. 改变世界的5大常数,学过数学的人,这一辈子都不会忘记!