0

0

C++的std::unique_ptr关键字有什么用途?怎么用?

冰火之心

冰火之心

发布时间:2025-06-06 13:33:01

|

510人浏览过

|

来源于php中文网

原创

std::unique_ptr是c++++11引入的智能指针,用于实现独占式所有权的资源管理。其核心用途是确保某个资源只能被一个指针拥有,并在离开作用域时自动释放,避免内存泄漏;“独占式”意味着资源不能被复制,但可以通过移动语义转移所有权;创建方式包括使用new直接初始化、推荐的std::make_unique以及管理数组类型的带[]删除器形式;访问资源可通过*和->操作符进行;所有权转移通过std::move实现,转移后原指针为空;常见注意事项包括不要手动delete资源、可安全放入容器中使用、支持自定义删除器以管理非内存资源。

C++的std::unique_ptr关键字有什么用途?怎么用?

std::unique_ptr 是 C++11 引入的一种智能指针,用来管理动态分配的对象,它的核心用途是实现独占式所有权的资源管理。说白了,就是确保某个资源(通常是堆内存)只能被一个指针拥有,并在它不再需要时自动释放,避免内存泄漏。


什么是“独占式”?

“独占式”意味着 std::unique_ptr 所指向的对象不能被复制给另一个 unique_ptr。也就是说,你不能写这样的代码:

std::unique_ptr p1(new int(5));
std::unique_ptr p2 = p1; // 编译错误!

这和 std::shared_ptr 不一样,后者允许多个指针共享同一个对象的所有权。而 unique_ptr 的设计目的就是为了更明确地表达:这个资源只能有一个主人,谁离开作用域谁就负责释放。

立即学习C++免费学习笔记(深入)”;


怎么创建和使用 std::unique_ptr?

常见的用法其实很简单,一般有以下几种方式:

  • 使用 new 直接初始化:

    std::unique_ptr ptr(new int(10));
  • 使用 std::make_unique(推荐):

    auto ptr = std::make_unique(10);

    这种方式更安全,也更简洁,推荐优先使用。

  • 管理数组类型(注意要用带 [] 的删除器):

    Python开发网站指南 WORD版
    Python开发网站指南 WORD版

    本文档主要讲述的是Python开发网站指南;HTML是网络的通用语言,一种简单、通用的全置标记语言。它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器 Python和其他程序语言一样,有自身的一套流程控制语句,而且这些语句的语法和其它程序语言类似,都有for, if ,while 类的关键字来表达程序流程。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

    下载
    auto arr = std::make_unique(5); // 创建长度为5的int数组

访问内部对象也很简单,就像普通指针一样用 *-> 操作符:

auto user = std::make_unique("Alice");
std::cout << user->getName() << std::endl;

如何转移所有权?

虽然 unique_ptr 不支持拷贝,但可以移动(move)。比如你可以把它作为函数返回值或者参数传递出去:

std::unique_ptr createInt() {
    return std::make_unique(42);
}

void useInt(std::unique_ptr ptr) {
    std::cout << *ptr << std::endl;
}

调用方式如下:

auto p = createInt(); // 所有权从函数内转移到p
useInt(std::move(p)); // 转移后,p变成空指针

注意:一旦移动之后,原来的指针就不再拥有资源了,相当于 null。


常见注意事项

  • 不要手动 delete:用了 unique_ptr 就不需要也不应该手动调用 delete

  • 配合容器使用没问题:可以把 unique_ptr 放进 std::vectorstd::map 中,只要不涉及拷贝操作就行。

  • 自定义删除器(高级用法):如果你管理的不是普通 new 出来的内存,比如文件句柄、socket 等资源,可以通过模板指定自定义删除逻辑。

    struct MyDeleter {
        void operator()(FILE* fp) const { fclose(fp); }
    };
    
    std::unique_ptr fp(fopen("file.txt", "r"));

基本上就这些。理解起来不难,但确实很容易因为习惯写法而出错,特别是刚从裸指针转过来的时候。用多了你会发现,std::unique_ptr 不仅能帮你省去手动管理内存的麻烦,还能让代码结构更清晰。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

226

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

430

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

359

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

558

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

73

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

23

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

36

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

31

2025.11.27

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

1

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.3万人学习

C 教程
C 教程

共75课时 | 3.7万人学习

C++教程
C++教程

共115课时 | 9.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号