unique_ptr的详细介绍

智能指针之unique_ptr简单实现-实现篇 1 序 1.1 智能指针 为了避免手动在堆中分配出的内存没有释放造成内存泄露的问题,C++11提供了智能指针。 智能指针将指针封装成一个栈对象。栈对象在生命周期结束自动销毁时会调用析构函数。智能指针基本上也是在析构函数中做文章,实现的堆上内存管理。 C++11推荐使用的智能指针有unique_ptr、shared_ptr和weak_ptr三种。 1.2 内容简介 本文为std::unique_ptr的实现篇,介绍实现一个UniquePtr类,实现与std::unique_ptr类似的功能。代码实现参考了st 阅读详情

unique_ptr 的详细介绍及典型使用场景的测试用例:


1. unique_ptr 核心特性

  • 独占所有权:同一时刻只有一个 unique_ptr 拥有对象所有权
  • 不可复制(但可移动):禁止拷贝构造和拷贝赋值,避免意外的所有权共享
  • 零开销:与裸指针相比,无额外内存或性能开销(编译器优化后)
  • 自动释放:离开作用域时自动释放资源,保证异常安全

2. 基本用法测试用例

(1) 创建与释放
#include <memory>
#include <iostream>

class MyResource {
public:
    MyResource() { std::cout << "资源创建\n"; }
    ~MyResource() { std::cout << "资源释放\n"; }
    void use() { std::cout << "使用资源\n"; }
};

int main() {
    // 创建 unique_ptr(推荐使用 C++14 的 make_unique)
    std::unique_ptr<MyResource> ptr = std::make_unique<MyResource>();
    ptr->use();

    // 显式释放资源(可选)
    ptr.reset(); // 输出 "资源释放"
    return 0;
}

输出结果:

资源创建
使用资源
资源释放

(2) 所有权转移
void transferOwnership(std::unique_ptr<MyResource> newOwner) {
    newOwner->use();
} // 函数结束时释放资源

int main() {
    std::unique_ptr<MyResource> owner = std::make_unique<MyResource>();
    
    // 转移所有权(移动语义)
    transferOwnership(std::move(owner)); 
    
    // 此时 owner 变为空指针
    if (!owner) {
        std::cout << "所有权已转移\n";
    }
    return 0;
}

输出结果:

资源创建
使用资源
资源释放
所有权已转移

3. 高级用法测试用例

(1) 管理数组
#include <memory>
#include <iostream>
int main() {
    // 管理动态数组(自动调用 delete[])
    std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);
    for (int i = 0; i < 5; ++i) {
        arr[i] = i * 10;
    }

    // 输出数组内容
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    return 0;
}

输出结果:

0 10 20 30 40

(2) 自定义删除器
#include <cstdio>
#include <memory>
#include <iostream>
// 自定义文件句柄释放逻辑
struct FileDeleter {
    void operator()(FILE* file) const {
        if (file) {
            std::fclose(file);
            std::cout << "文件已关闭\n";
        }
    }
};

int main() {
    // 使用自定义删除器管理文件
    std::unique_ptr<FILE, FileDeleter> filePtr(
        std::fopen("test.txt", "w"), 
        FileDeleter{}
    );

    if (filePtr) {
        std::fputs("Hello unique_ptr", filePtr.get());
    }
    return 0;
}

输出结果:

文件已关闭

(3) 作为函数返回值
#include <memory>
#include <iostream>

class MyResource {
public:
    MyResource() { std::cout << "资源创建\n"; }
    ~MyResource() { std::cout << "资源释放\n"; }
    void use() { std::cout << "使用资源\n"; }
};
std::unique_ptr<MyResource> createResource() {
    return std::make_unique<MyResource>();
}

int main() {
    auto res = createResource();
    res->use();
    return 0;
}

输出结果:

资源创建
使用资源
资源释放

4. 常见错误规避

(1) 禁止拷贝操作
std::unique_ptr<MyResource> ptr1 = std::make_unique<MyResource>();
std::unique_ptr<MyResource> ptr2 = ptr1; // 编译错误!
(2) 正确释放后访问
auto ptr = std::make_unique<MyResource>();
ptr.reset(); // 释放资源
ptr->use();  // 未定义行为(程序可能崩溃)

5. unique_ptr 与 shared_ptr 对比

特性unique_ptrshared_ptr
所有权独占共享
性能开销无引用计数原子操作
拷贝语义禁止(仅移动)允许
典型场景工厂模式、资源独占管理多对象共享资源

6. 最佳实践总结

  • 优先使用 make_unique(C++14+):避免显式 new,保证异常安全
  • 明确所有权转移:通过 std::move 传递所有权
  • 避免与裸指针混用:不直接暴露 get() 获得的指针
  • 自定义删除器:灵活管理非内存资源(文件、网络连接等)

通过合理使用 unique_ptr,可以显著提高代码的 资源安全性 和 可维护性。

unique_ptr的使用 初始化unique_ptr unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。由于unique_ptr不可拷贝和赋值,初始化unique_ptr必须使用直接初始化的方式。c++14正式引入的make_unique,所以我们在初始化的时候尽量使用make_unique,而不是不直接使用new,具体原因参考这篇文章。 另外unique_ptr还有更聪明的地方:当程序试图将一个 unique_ptr 赋值给另一 阅读详情

相关推荐

C++11智能指针-unique_ptr

前面介绍了C++98 的智能指针auto_ptr,现在来介绍一下它的替代品【unique_ptr】 看完,我也是醉了。好吧 我们继续 auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。auto_ptr 主要有三大问题: 复制和赋值会改变资源的所有权,不符合人的直觉。 在 STL 容器中使用auto_ptr存在重大风险,因为容器内的元素必需支持可复制(copy constructable)和可..

qq_44065088的博客 239

智能指针 unique_ptr 详解

一、智能指针 1.什么是智能指针 简单地说,C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。 2.常规指针存在的问题 C++在内存分配、释放和管理方面向程序猿提供了全面的灵活性。但是这种灵活性是把双刃剑,一方面它使C++成为一种功能强大的语言,另一方面它让程序猿能够制造与内存相关的问题,比如内存泄漏。 例如在堆声明和分配的内存,析构方法是否会自动销毁对象,又或是方法结束后需要一个个释放,方法存在很多返回的

顺其自然~专栏 2万+

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

详细讲解C++11中引入的智能指针unique_ptr、shared_ptr和weak_ptr。

dvlinker的技术专栏 3万+

【C++11智能指针】unique_ptr概述、初始化、常用操作、返回unique_ptr、指定删除器、尺寸

1.unique_ptr概述 2.unique_ptr的初始化 2.1 直接初始化 2.2 make_unique函数 3.unique_ptr不支持拷贝构造和拷贝赋值 4.unique_ptr支持移动构造和移动赋值 5.unique_ptr的常用操作 6.返回unique_ptr 7.指定删除器 8.unique_ptr的尺寸

脚踏实地,仰望星空 8709

C++经典面试题之深入解析智能指针unique_ptr的实现原理与自定义实现

unique_ptr 独享它指向的对象,也就是说,同时只有一个 unique_ptr 指向同一个对象,当这个 unique_ptr 被销毁时,指向的对象也随即被销毁。这也是它和 shared_pt r不一样的地方,它不需要做引用计数,也不可以被第二个人引用,只有它自己。unique_ptr 作为一个类的成员变量,这个变量只在本类使用,不会被赋值给其他类,也不会作为参数传递给某个函数;在一个函数作为局部变量,使用完就不用再管,函数结束,自动释放托管资源。

╰つ栺尖篴夢ゞ 2139

Vscode远程免密连接Linux虚拟机,并配置C/C++运行环境

目前想要深入学习在Linux,也为了方便编写C/C++程序。Linux的环境里一般自带有c++的编译环境,如果没有安装gcc和g++等编译器也比较便利。但是在虚拟机里用vim编写C++程序又不得劲,因此打算使用vscode远程连接Linux虚拟机进行学习。为了防止自己以后还要再配置,重复踩坑,因此写下这篇博客用做记录。环境:windows11、VMware17、rocky linux9.1 ( 开源的CentOS9 )

m0_56779872的博客 8678

c++ std::unique_ptr详细介绍

c++ std::unique_ptr详细介绍

m0_50771141的博客 241

MTK PE+2.0介绍

  PE+2.0介绍:   1.      PE+2.0的状态机: 2.      升压波形协议及编码规则: PE+2.0软件设计:   在充电器类型为标充且底层电量SOC在1%—95%之间时,开始PE+2.0升压充电器的检测:首先将VBUSreset至5V,之后发送8.5的current pattern再获取此时VBUS电压和8.5V比较,若其与8.5的差值绝对值在0.5之...

raydom07的博客 1万+

C++智能指针之auto_ptr、unique_ptr、shared_ptr、weak_ptr的详细介绍

我们先来看看为什么需要有智能指针。看看下面的代码 void demo(std::string& str) { std::string *ps = new std::string(str); ... str = ps; return; } 上面的代码很明显的每次调用都在分配堆上的空间,但是却从不收回,从而导致内存泄露。当然我们知道在 return;前加上delete ps;。...

一条二哈 1543

EDK2多平台编译实战:从树莓派到RK3399的UEFI固件构建

本文提供了从树莓派到RK3399的EDK2多平台编译实战指南。详细介绍了UEFI固件构建的环境搭建、交叉编译配置、平台描述文件修改及常见问题排查,帮助开发者掌握为不同ARM架构硬件构建标准化启动固件的核心技能。

weixin_29193259的博客 836

DTW Barycenter Averaging(DBA)——平均序列求法

DBA该算法是用来求序列数据集SS的一致序列(平均序列)。由Franc-ois Petitjean提出的。目前,该方法求得的平均序列是最准确的。 假设一元组为S={s1,s2,⋯,sn}S={s1,s2,\cdots,sn},当SS中的元素为实数时,很容易求的SS的平均值: avg=s1+s2+⋯+snn(1) avg = \dfrac{s1 +s2+\cdots+sn}{n} \qquad\q

光怪陆离 1万+

C++11智能指针(六):unique_ptr介绍与例子

本节介绍下c++11提供的智能指针实现: std::unique_ptr&lt;&gt;什么是std::unique_ptrunique_ptr &lt;&gt;是c ++ 11提供的智能指针实现之一,用于防止内存泄漏。unique_ptr对象包含一个原始指针,并负责其生命周期。当这个对象被销毁的时候,它的析构函数会删除关联的原始指针。unique_ptr有重载的- &gt;和*运算符,所以它可以...

小麒麟的成长之路 1万+

人形机器人五大核心零部件技术解析与国产化实况

人形机器人并非简单机械集成,而是物理、能量、感知、决策与执行五层系统毫秒级协同的复杂体。其性能瓶颈往往不在于整机算法,而深植于谐波减速器的刚度稳定性、无框力矩电机的功率密度与温升控制、六维力传感器的动态响应与温漂抑制、运动控制器的实时OS生态及灵巧手的多指协同精度等底层硬件能力。这些部件共同构成整机68.3%的成本,且国产化率差异显著——谐波减速器达72%,而高精度力矩传感器仍受制于日德厂商。本文聚焦‘谐波减速器’和‘六维力传感器’两大热词,从材料工艺、参数定义、失效模式到产线验证,揭示真正卡脖子的技术关卡

weixin_29065959的博客 406

C++ unique_ptr介绍及仿写

文章目录一、unique_ptr的使用二、unique_ptr类的成员方法二、仿写总结 一、unique_ptr的使用 (1)构造函数不能进行隐式转换 (2)unique_ptr可以指向动态数组。因为unique_ptr有unique_ptr<T[]>重载版本,销毁动态对象时调用delete[]。 (3)unique_ptr无拷贝语义,但提供了移动语义,所以可作为函数返回值。 (4)谨慎使用智能指针的get与release方法 当使用get方法返回裸指针时,智能指针并没有释放指向对象的所有权.

Jqivin的博客 942

PCL点云算法与项目实战案例汇总(长期更新)

本专栏将深入探讨PCL(点云库)的基础算法,旨在帮助读者掌握点云处理的核心技术。内容涵盖点云的采样、过滤、配准、分割等基础操作,并结合实际案例,展示这些算法在工程中的应用。无论你是初学者还是有一定经验的开发者,都能通过本专栏加深对PCL的理解,提升在三维数据处理领域的技能。

纵马踏花向自由 3007

[自动化工具] 解放双手的利器:「自动邮件平台」工具助你高效搞定重复通知任务

摘要:自动邮件平台是一款零门槛自动化工具,帮助用户高效处理重复性邮件任务。该平台支持两种调度模式(指定日期和间隔天数),无需编码即可快速设置账单提醒、活动通知等任务。提供免费托管版(小时级调度)和自主部署版(分钟级调度),满足不同精度需求。典型应用场景包括客户跟进、系统监控等周期性任务。用户只需三步即可完成设置,还能扩展定制化功能。该工具让非技术人员也能轻松实现邮件自动化,释放时间专注更重要的工作。

每日出拳老爷子的博客 108

智能指针unique_ptr

shared_ptr shared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。从名字share就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。当我们调用release()时,当前指针会释放资源所有权,计数减一。当计数等于0时,资源会被释放。 1

yizhiniu_xuyw的专栏 403

LDO的原理及测试方法

这是LM317芯片的核心,这个电路单元称为Bandgap Reference带隙基准源。属于模拟集成电路中的经典电路结构。常见的基本结构利用VBE的负温度系数,而VT是正温度系数,正负温度系数抵消就的得到稳定的基准参考电压了(三极管的方程VBE=VT*In(lC/IS))。

shiwei0813的博客 1157

C++ unique_ptr

unique_ptr 不共享它的指针。它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL) 算法。只能移动unique_ptr。这意味着,内存资源所有权将转移到另一 unique_ptr,并且原始 unique_ptr 不再拥有此资源。我们建议你将对象限制为由一个所有者所有,因为多个所有权会使程序逻辑变得复杂。因此,当需要智能指针用于纯

u010442009的专栏 499

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++智能指针总结二——unique_ptr

C++智能指针总结二1.往期回顾2.auto_ptr的缺陷1.缺陷一2.缺陷二3.unique_ptr1."更安全的赋值"2.支持创建动态数组3.补充API 1.往期回顾 2.auto_ptr的缺陷 1.缺陷一 先来看下面的代码: #include <Windows.h> #include <iostream> #include <string> #include <vector> #include <memory> using na

weixin_45738899的博客 1772

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++智能指针 unique_ptr

C++智能指针 unique_ptr概念unique_ptr“唯一”拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。unique_ptr指针与其所指对

stary_yan的博客 998

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

究竟什么时候用shared_ptr,什么时候用unique_ptr?

`std::unique_ptr`用于独占所有权,适合没有共享需求的场景;`std::shared_ptr`用于共享所有权,适合多个对象共享资源,但需注意循环引用;`std::weak_ptr`解决循环引用问题。通常,优先使用`unique_ptr`,共享资源时选择`shared_ptr`,并通过`make_unique`和`make_shared`提高安全性。

qq_29426201的博客 1017

repost: auto_ptr与unique_ptr的关系:

from: https://blog.youkuaiyun.com/weixin_40081916/article/details/79377564 auto_ptr与unique_ptr auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。auto_ptr 主要有两大问题: o 复制和赋值会改变资源的所有权,不符合人的直觉。 o 在 STL 容器中无法使用auto_ptr ,因为容器内的元素必需支持可复制(copy c

ChengChengCheng的博客 193

std::unique_ptr

一、产生的原因: unique_ptr的产生,就是为了解决,raw pointer 的new和delete配对使用问题。对于raw pointer来说,在new了之后,在delete之前往往会出现程序异常,进而导致delete没有被释放,如此以来就会产生内存泄漏。引入了unique_ptr之后,可以有效的减轻C++程序员对于raw pointer的使用负担。参考官方文档: std::uniqu...

To the beyond and infinity! 1419

C++智能指针之 auto_ptr和unique_ptr

auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。 auto_ptr 主要有两大问题: 1、复制和赋值会改变资源的所有权,不符合人的直觉。 2、在 STL 容器中无法使用auto_ptr ,因为容器内的元素必需支持可复制(copy constructable)和可赋值(assignable)。 unique_ptr特性 1、拥有它所指向的对象 2、 无法进行复制构造,也无法进行复制赋值操作 3、保存指

feikudai8460的博客 434

c++中的unique_ptr智能指针

1、与shared_ptr不同。某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。 2、unique_ptr初始化必须采用直接初始化的的形式:unique_ptrp1;      //指向一个double类型的unique_ptr       unique_ptrp2 (new int (42)); //p2指向一个值为42

Hacker_Dream的博客 2023
上一篇: shared_ptr和 weak_ptr的详细介绍
下一篇: std::reference_wrapper 和 std::function的详细介绍
froxy
博客等级 码龄15年 208粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值