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

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);

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

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

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

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

auto user = std::make_unique("Alice");std::cout <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(); // 所有权从函数内转移到puseInt(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++的std::unique_ptr关键字有什么用途?怎么用?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1462609.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 14:34:16
下一篇 2025年12月18日 14:34:32

相关推荐

  • c++中=是什么意思 赋值运算符使用规范

    在c++++中,=符号代表赋值运算符,用于将右侧的值赋给左侧的变量。其使用规范包括:1) 返回左侧操作数的引用,支持链式赋值;2) 处理对象时调用拷贝赋值运算符,需重载以确保正确行为;3) 注意避免混淆赋值和比较运算符;4) 使用移动赋值运算符优化大对象的性能。 在C++中,=符号代表赋值运算符,它…

    2025年12月18日
    000
  • C++中的lambda表达式是什么意思?怎么用?

    lambda表达式在c++++中是一种简洁定义匿名函数对象的方式,常用于需要简单函数逻辑的地方。它的语法形式为capture -> return_type { function_body },其中capture指定捕获外部变量的方式,parameters是参数列表,return_type可省略…

    2025年12月18日
    000
  • C++的*运算符有哪些用途?怎么用?

    c++++中运算符主要有三种常见用途。第一指针声明,如int p表示p是指向int的指针变量;第二解引用操作,通过ptr可访问或修改指针指向的内容;第三乘法运算,用于数值类型的相乘如53结果为15。此外还有成员指针访问、智能指针访问以及运算符重载等较少用法。理解不同上下文中的作用是正确使用的关键。 …

    2025年12月18日
    000
  • C++的constexpr关键字怎么用?能优化什么?

    c++onstexpr 是 c++11 引入并在后续标准中增强的关键字,用于声明可在编译期求值的变量或函数。1. constexpr 变量必须在编译时确定值,如 constexpr int size = 10;,相比 const 更严格;2. constexpr 函数可在编译期执行,如 conste…

    2025年12月18日
    000
  • C++中的throw和catch怎么用?有什么作用?

    在C++中,throw 和 catch 是异常处理机制的重要组成部分。它们的作用是让程序在运行时遇到错误时,能够跳过正常流程,转而执行专门的错误处理代码。 基本用法:throw抛出异常 throw 用来抛出一个异常。它可以抛出任何类型的值(比如 int、string、自定义类等),但通常会使用标准库…

    2025年12月18日
    000
  • C++中的nullptr怎么用?和NULL有什么区别?

    在C++中,nullptr 是用来表示空指针的字面量,它比传统的 NULL 更加安全和直观。简单来说,nullptr 是现代C++推荐使用的空指针表示方式,而 NULL 则是C语言遗留下来的用法,在C++中也还能用,但有局限性。 下面从几个实际使用场景出发,看看 nullptr 怎么用,以及它和 N…

    2025年12月18日
    000
  • C++中的typeid怎么用?能获取什么信息?

    typeid能获取类型名称、判断类型是否相同以及获取哈希值。1.通过.name()方法获取类型名,但可读性差;2.用==或!=比较类型;3.调用.hash_code()获取唯一标识符。在多态场景下,作用于对象指针时需使用obj形式才能识别实际类型,如对base obj指向的derived对象,typ…

    2025年12月18日
    000
  • 在c++中什么是运算符 c++中运算符分类说明

    c++++中的运算符分为六类:1. 算术运算符(+、-、、/、%)用于数学运算,需注意整数除法的截断。2. 关系运算符(==、!=、>、=、>)用于二进制操作,需理解位运算避免错误。5. 赋值运算符(=、+=、-=、=、/=)用于赋值,需注意操作顺序。6. 增量和减量运算符(++、&#8…

    2025年12月18日
    000
  • c++中运算符的种类及用法 c++中七大类运算符详解

    c++++中的七大类运算符包括:1. 算术运算符(+、-、、/、%、++、–),用于基本数学运算;2. 关系运算符(==、!=、>、=、>、~),用于二进制操作;5. 赋值运算符(=、+=、-=、=、/=、%=、>=、&=、|=、^=),用于变量赋值;6. 条件…

    2025年12月18日
    000
  • C++中的alignas是什么?怎么定义和使用?

    alignas是c++++中用于指定变量或类型对齐方式的关键字,主要作用是控制内存布局以提升访问效率。1. 它可用于变量声明、结构体成员、类或结构体本身,语法包括alignas(常量表达式)和alignas(类型)两种形式;2. 常见使用场景包括控制结构体对齐以适配图形api或simd操作、优化数据…

    2025年12月18日
    000
  • c++中逻辑运算符用法 c++中与或非运算实例

    c++++中的逻辑运算符包括:1. &&(与):当两个操作数都为真时,结果为真,用于需要多个条件都满足的情况;2. ||(或):只要其中一个操作数为真,结果就为真,适用于满足多个条件中的任何一个;3. !(非):用于反转布尔值,检查某个条件是否不满足。使用这些运算符时需注意短路求值、…

    2025年12月18日
    000
  • C++中的静态链接和动态链接有什么区别?

    静态链接在编译时将库嵌入可执行文件,动态链接在运行时加载库。1. 静态链接提供独立性和便携性,但文件大且需重新编译更新。2. 动态链接节省空间,易更新,但需确保库存在,性能可能受影响。 静态链接和动态链接在C++中是两种不同的链接方式,它们在程序的构建和运行过程中扮演着不同的角色。让我们深入探讨一下…

    2025年12月18日
    000
  • c++中优先级最高的运算符 c++中作用域解析符优先级

    c++++中优先级最高的运算符是作用域解析运算符(::)。它用于指定标识符的作用域,确保在命名冲突时正确引用变量、函数或类:1.全局作用域(::variable);2.类作用域(classname::member);3.命名空间作用域(namespacename::function),它在编译时解析…

    2025年12月18日
    000
  • c++中各符号的含义 c++中常见运算符功能速查

    c++++中的符号和运算符包括算术、关系、逻辑、位、赋值和增量运算符,它们是编程的基础。1) 算术运算符用于基本计算,如加法、减法、乘法、除法和取模。2) 关系运算符用于比较,返回布尔值。3) 逻辑运算符组合布尔表达式,需注意短路求值。4) 位运算符直接操作二进制位,适用于嵌入式系统和优化。5) 赋…

    2025年12月18日
    000
  • C++的concept关键字有什么用途?怎么用?

    c++oncept 是 c++20 引入的关键字,用于定义模板参数的约束条件。1. 它通过明确类型必须满足的操作(如支持加法或具有成员函数)来提升代码清晰度和错误提示友好性;2. 解决了此前模板无法限制参数类型的缺陷,使编译器能精准指出不匹配问题;3. 定义方式为 template concept …

    2025年12月18日
    000
  • c++中的符号大全 c++中所有运算符功能速查

    c++++中的运算符分为算术、关系、逻辑、位、赋值和特殊运算符。1.算术运算符用于基本数学运算,如加减乘除和取模。2.关系运算符用于比较,返回布尔值。3.逻辑运算符用于组合布尔表达式。4.位运算符用于二进制操作。5.赋值运算符包括基本和复合赋值。6.特殊运算符如sizeof、逗号和箭头运算符用于特定…

    2025年12月18日
    000
  • C++中的structured binding是什么?如何使用?

    c++++17的结构化绑定允许从复合类型中直接解包变量,提升代码可读性。其主要用法包括:1. 从std::pair和std::tuple解包,如auto [id, value, msg] = getdata(),避免使用std::get或.first/.second;2. 用于结构体,如struct…

    2025年12月18日
    000
  • 什么是C++中的代码风格指南?

    c++++中的代码风格指南是一套规则和最佳实践,旨在帮助开发者编写一致、可读性强且易于维护的代码。具体包括:1. 命名约定:类名通常采用驼峰命名法,变量和函数名采用蛇形命名法。2. 缩进和对齐:使用4个空格进行缩进,避免过度对齐。3. 注释和文档:使用doxygen风格的注释,并在复杂逻辑中添加详细…

    2025年12月18日
    000
  • C++的noexcept关键字有什么用途?如何正确使用?

    noexc++ept关键字在c++中用于声明函数是否抛出异常,影响运行时行为与编译器优化。1. 提升性能:标记为noexcept的函数允许编译器优化,如优先使用移动操作而非复制操作,尤其在容器扩容时;2. 增强可读性:明确告知调用者函数不会抛出异常,提升代码可读性与安全性;3. 使用技巧:应在确定不…

    2025年12月18日
    000
  • C++的mutable关键字有什么作用?如何使用?

    在c++++中,mutable关键字允许const对象的某些成员变量在const成员函数中被修改,其核心用途包括缓存结果、计数器及同步控制结构。1.缓存结果:如compute()函数中,将耗时计算的结果缓存起来,通过标记cached为mutable实现不破坏const性质;2.计数器:记录const…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信