首页 > 其他分享 >独占智能指针

独占智能指针

时间:2023-12-12 15:12:05浏览次数:23  
标签:独占 int ptr1 智能 new 100 unique ptr 指针

文章参考:

爱编程的大丙 (subingwen.cn)

1. 初始化:

特点:

相较于共享智能指针,独占智能指针(unique_ptr)的关键在于:同一时刻,只能有一个智能指针指向同一块内存。因此独占智能指针不允许使用拷贝构造函数和拷贝赋值函数。

初始化:

  • 通过构造函数初始化:

    unique_ptr<int> ptr1(new int(100));
    
  • 通过移动构造函数/移动赋值函数:

    unique_ptr<int> ptr1(new int(100));
    unique_ptr<int> ptr2(move(ptr1));
    unique_ptr<int> ptr3 = move(ptr1);
    
  • 通过函数返回给其他的std::unique_ptr(本质上是返回一个右值,然后通过移动构造函数/移动赋值函数进行初始化):

    unique_ptr<int> func(){
        return unique_ptr<int>(new int(100));
    }
    int main(void){
        unique_ptr<int> ptr = func();
        return 0;
    }
    

2. 成员函数

2.1 reset

原型:

void reset( pointer ptr = pointer() ) noexcepter;

作用:

  • 解除独占智能指针对于目标内存的管理:

    unique_ptr<int> ptr1(new int(100));
    ptr1.reset();
    
  • 重新指定独占智能指针的目标内存:

    unique_ptr<int> ptr1(new int(100));
    ptr1.reset(new int(100));
    

2.2 get()

原型:

pointer get() const noexcept;

作用:

获取独占智能指针管理的原始地址。

3. 删除器

3.1 删除器类型

unique_ptr在指定删除器时和shared_ptr不同,unique_ptr必须指定删除器的类型,这就带来了一个问题:如果我们使用lambda表达式定义删除器,lambda表达式有以下特性:

  • 当lambda不捕获外部变量时,可以转化为一个函数指针。

    using func_ptr = void(*)(int*);
    unique_ptr<int, func_ptr> ptr(new int(100),
                                 [](int* p){
                                     delete p;
                                 });
    
  • 如果lambda捕获外部变量,那么就相当于一个仿函数。因此下面的代码存在错误:

    using func_ptr = void(*)(int*);
    // error。lambda捕获了外部变量的值,此时相当于一个仿函数,与函数指针不匹配。
    /* unique_ptr<int, func_ptr> ptr(new int(100),
                                 [&](int* p){
                                     delete p;
                                 }); */
    

因此,我们一般使用可调用对象包装器来指定独占智能指针的删除器类型:

unique_ptr<int, function<void(int*)>> ptr(new int(100),
                             [](int* p){
                                 delete p;
                             });

3.2 数组删除器

shared_ptr的操作一致。

标签:独占,int,ptr1,智能,new,100,unique,ptr,指针
From: https://www.cnblogs.com/beasts777/p/17896965.html

相关文章

  • 聊天记录年度报告一览无余:轻松多格式导出永久保存,深度智能分析
    聊天记录年度报告一览无余:轻松多格式导出永久保存,深度智能分析1.功能简介效果展示一个用于提取微信聊天记录的工具,支持将聊天记录导出成HTML、Word、CSV文档,以实现永久保存。此外,该工具还具有对聊天记录进行分析的功能,可以生成年度聊天报告,帮助用户更好地了解和回顾与他人的沟通......
  • CodeGeeX智能编程
    一、写在前面大家遇到代码不会的问题,本能的就会去求助chatGPT,但是没有梯子的话,chatGPT是不是也帮不上忙了?秉着白嫖的精神,分享给大家一款非常牛的插件CodeGeex。二、CodeGreex简介CodeGreex支持多种主流IDE,如VSCode、IntelliJIEAD、PyCharm、vim等,同时支持Python、java、C++/C......
  • 计算机初级选手的成长历程——指针(5)
    进阶指针导言大家好,很高兴又和大家见面了!!!在上一个章节中,咱们深入探讨了一下指针与数组之间的联系,在探讨的过程中我们发现对于指针数组与二级指针来说,它们实质上就是一维数组和一级指针,它们之间的关系也是遵从指针与数组之间关系。为了更好的学习指针,在今天的内容中,我们将介绍指针的......
  • 探索AI在CRM中的潜力:智能化客户关系的构建
    AI人工智能在CRM系统中的应用有:赋能内容生产、客户服务支持、赋能品牌推广、自动化业务流程、数据分析、辅助科学决策、给出最佳客户联系时间。合理运用CRM系统中AI人工智能助手可以让团队工作事半功倍。1.内容生产市场营销活动离不开内容生产,持续的产出高质量的内容又给营销团......
  • 火星探测器背后的人工智能:从原理到实战的强化学习
    本文详细探讨了强化学习在火星探测器任务中的应用。从基础概念到模型设计,再到实战代码演示,我们深入分析了任务需求、环境模型构建及算法实现,提供了一个全面的强化学习案例解析,旨在推动人工智能技术在太空探索中的应用。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务......
  • 【开源项目推荐】-支持GPT的智能数据库客户端与报表工具——Chat2DB
    2023年是人工智能爆火的一年,ChatGPT为首的一系列的大模型的出现,让生成式人工智能彻底火了一把。但有人会说,GPT对于我们数据开发来说并没有什么作用啊?今天为大家推荐的开源项目,就是GPT在数据领域的一个优秀实践项目。让我们一起来看看吧~Chat2DB是一个集成了ChatGPT功能的数据库S......
  • 多开工具与智能城市建设的结合与创新
    多开工具与智能城市建设的结合与创新摘要:随着科技的快速发展,智能城市建设成为了现代化城市发展的重要目标。而多开工具作为一种技术手段,不仅可以提高城市基础设施的效率,还能够为智能城市建设带来更多的创新。本文将探讨多开工具与智能城市建设的结合,并提出一些创新的观点和建议。......
  • 实验6 C语言结构体,枚举应用编程(附实验5 C语言指针应用编程)
    实验6一,实验目的二,实验准备三,实验内容1,实验任务1task1.c1#include<stdio.h>2#include<string.h>3#defineN3//运行程序输入测试时,可以把这个数组改小一些输入测试45typedefstructstudent{6intid;//学号7......
  • 软件测试/人工智能|Python数据可视化神器pyecharts教程(一)
    前言在很多时候,枯燥的数字并不能很直观的展示地域的差别,比如一个企业,想要分析产品在国内的销售情况,报表可能并不能最直接的展示差异,而一个结合地图的展示,就会直观得多,更便于大家去看到差距,更利于决策。当然,除了做商业决策,将数据与地图结合,也更便于我们展示诸如人口密度,经济总量等数......
  • 软件测试/人工智能|Java Edit Plus 安装与配置指南
    前言最近我这个一直使用Python的人,开始尝试学习了一下Java,我的朋友跟我说,别像Python那样,开始就使用一个功能强大的IDE,Java语法更为复杂,可以先使用一个轻量化的编辑器,我开始准备使用notepad++,我朋友跟我推荐了EditPlus,我使用之后,就真香了,本文就给大家介绍一下EditPlus的安装和配置。......