C++智能指针有哪些 unique_ptr使用指南

unique_ptr是C++中独占式智能指针,通过自动管理内存防止泄漏,支持make_unique创建、move语义转移所有权、reset释放资源,适用于无需共享的场景。

c++智能指针有哪些 unique_ptr使用指南

智能指针是C++中用于自动管理动态内存的重要工具,能有效避免内存泄漏和资源管理错误。C++标准库提供了三种主要的智能指针:unique_ptr、shared_ptr 和 weak_ptr。每种都有其特定用途和行为。

三种智能指针简介

unique_ptr:独占式智能指针,同一时间只能有一个unique_ptr拥有某个对象。当unique_ptr被销毁时,其所管理的对象也会自动被删除。适用于不需要共享所有权的场景。

shared_ptr:共享式智能指针,多个shared_ptr可以共同拥有同一个对象。内部使用引用计数机制,当最后一个shared_ptr被销毁时,对象才被释放。适合需要共享所有权的情况。

weak_ptr:弱引用指针,通常配合shared_ptr使用,不增加引用计数,用于解决循环引用问题。它本身不能直接访问对象,必须通过lock()转换为shared_ptr。

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

unique_ptr 使用指南

unique_ptr 是最轻量、高效的智能指针,推荐在大多数需要动态分配对象且不共享的场合优先使用。

1. 创建 unique_ptr

使用 std::make_unique(C++14起)是最推荐的方式:

std::unique_ptr ptr1 = std::make_unique(42);std::unique_ptr ptr2 = std::make_unique(“hello”);

也可以用构造函数(但不推荐直接new):

std::unique_ptr ptr(new int(10)); // 合法但不如make_unique安全

2. 独占所有权

unique_ptr不允许普通拷贝,只能通过移动语义转移所有权:

std::unique_ptr ptr1 = std::make_unique(100);std::unique_ptr ptr2 = std::move(ptr1); // ptr1 变为 nullptr// int value = *ptr1; // 错误!ptr1 已经不拥有对象

3. 访问和操作对象

使用 * 和 -> 操作符访问所管理的对象:

std::unique_ptr name = std::make_unique(“Alice”);std::cout name->append(” Smith”); // 调用 string 的 append 方法

4. 释放或重置资源

调用 reset() 会释放当前管理的对象,可传入新对象或传 nullptr:

ptr.reset(); // 释放对象,ptr 变为 nullptrptr.reset(new int(200)); // 释放旧对象,管理新对象

释放时会自动调用 delete,如果是数组,会调用 delete[]。

5. unique_ptr 与数组

管理数组时,需指定数组类型,并会自动使用 delete[]:

std::unique_ptr arr = std::make_unique(10);arr[0] = 1; arr[1] = 2; // 正确访问

注意:make_unique 支持数组(C++14起),但不支持带初始化列表的数组。

6. 作为函数参数和返回值

推荐通过值传递 unique_ptr 实现所有权转移:

std::unique_ptr createValue() { return std::make_unique(42); }void useValue(std::unique_ptr ptr) { /* ptr 在函数结束时释放 */ }

如果只是读取,应传递引用:

void inspect(const std::unique_ptr& ptr) { if (ptr) std::cout

基本上就这些。unique_ptr 设计简洁高效,是现代C++资源管理的首选。只要记住它“独占”和“自动释放”的特性,合理使用 make_unique 和 move,就能写出安全又高效的代码。

以上就是C++智能指针有哪些 unique_ptr使用指南的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 19:52:37
下一篇 2025年12月18日 19:52:54

相关推荐

  • C++联合体实现变体记录 多种类型存储方案

    C++联合体通过共享内存实现变体记录,节省空间但需谨慎管理类型安全;std::variant是更安全的替代方案。 C++联合体提供了一种在相同内存位置存储不同类型数据的有效方式,从而实现变体记录。它允许你像访问一个单一变量那样访问不同的数据类型,但每次只能存储其中一种类型。 解决方案: C++联合体…

    2025年12月18日
    000
  • C++对象池模式 资源重复利用优化

    对象池通过预创建和复用对象减少内存开销,适用于高频创建销毁的场景。1. 初始化时批量创建对象存入空闲列表;2. 获取时从列表弹出,归还时重新加入;3. 支持动态扩容以应对需求增长;4. 使用定位new和显式析构重置对象状态;5. 建议合理设置初始容量、添加线程安全机制、配合内存池使用,并避免资源长时…

    2025年12月18日
    000
  • C++异常安全vector 内存分配失败处理

    在C++中实现异常安全的vector需确保内存分配失败时不泄漏资源,关键是在修改状态前完成所有可能抛出异常的操作。1. 扩容时先用临时缓冲区分配新内存并复制元素,若构造异常则释放临时内存并保持原状态,实现强异常安全;2. 使用std::allocator配合RAII(如std::unique_ptr…

    2025年12月18日
    000
  • C++ enable_shared_from_this 获取this的shared_ptr

    在C++中,对象内部获取自身shared_ptr时应继承enable_shared_from_this并使用shared_from_this(),避免直接new this或构造新shared_ptr,以防引用计数紊乱导致重复释放;需确保对象已被shared_ptr管理,且不在构造或析构函数中调用。 …

    2025年12月18日
    000
  • C++变参模板 参数包展开模式

    C++变参模板通过参数包展开实现泛型编程,核心方式为递归展开和C++17折叠表达式;后者以简洁语法支持运算符折叠,显著提升代码可读性与效率,适用于日志、tuple、事件分发等场景,需注意递归终止、错误信息复杂及性能问题,优化策略包括优先使用折叠表达式、完美转发和constexpr。 C++变参模板中…

    2025年12月18日
    000
  • C++字符串处理如何优化 SSO短字符串优化技术

    c++kquote>SSO(短字符串优化)是std::string在内部缓冲区存储短字符串以避免堆分配的技术,提升性能。其通过固定缓冲区存储短字符串(通常15~22字节),使构造、拷贝更高效。不同库实现阈值不同,使用时应控制字符串长度、避免冗余拷贝、合理预分配空间,并注意跨库兼容性问题。可通过…

    2025年12月18日
    000
  • C++ noexcept关键字 异常规范替代方案

    noexcept关键字用于声明函数不抛异常,提升性能与安全性,替代旧式throw()规范,编译期确定无运行时开销,标准库优先使用noexcept移动构造函数优化容器操作,还可作为操作符在模板中条件化异常规范。 在C++中,noexcept关键字是异常规范(exception specificatio…

    2025年12月18日
    000
  • shared_ptr控制块在哪 引用计数存储位置解析

    shared_ptr的控制块位置取决于创建方式:make_shared时控制块与对象同分配,提升性能;通过原始指针构造时则单独分配控制块,需两次内存操作,效率较低且易引发double free。 shared_ptr 的控制块,也就是存储引用计数的地方,它的位置并不固定,取决于 shared_ptr…

    2025年12月18日
    000
  • C++模板参数推导 构造函数自动推导规则

    C++17引入类模板参数推导(CTAD),允许编译器根据构造函数参数自动推导模板类型,如std::pair p(1, 2.0);可自动推导为std::pair,无需显式指定类型,简化了模板实例化过程。该特性适用于标准库容器(如vector、tuple)和自定义类模板,结合自定义推导指南可实现更灵活的…

    2025年12月18日
    000
  • C++ placement new怎么用 指定内存地址构造对象

    placement new用于在指定内存地址构造对象,语法为new (address) Type(args),适用于内存池、共享内存等场景,需手动调用析构函数并管理内存生命周期。 在C++中,placement new 是一种特殊的 new 表达式,允许你在已分配的内存地址上构造对象。它不会分配新的…

    2025年12月18日
    000
  • C++模板元编程 编译期计算优化技巧

    使用constexpr和consteval可在编译期完成计算,提升性能;2. 编写递归constexpr函数如factorial,确保编译器在编译阶段求值,减少运行时开销。 在C++模板元编程中,利用编译期计算可以显著提升程序性能,减少运行时开销。关键在于让编译器在编译阶段完成尽可能多的计算工作,从…

    2025年12月18日
    000
  • noexcept关键字怎么用 移动操作优化指南

    noexcept关键字能提升移动操作性能,当移动构造函数或赋值运算符不抛异常时应标记为noexcept,标准库如std::vector在扩容时会优先移动而非拷贝,前提是移动操作为noexcept,否则退化为拷贝以保证异常安全,正确使用可显著提升效率。 在C++中,noexcept关键字对移动操作的性…

    2025年12月18日
    000
  • C++分支预测优化 likely unlikely宏

    C++20引入[[likely]]和[[unlikely]]属性以优化分支预测,提示编译器某分支更可能或更不可能执行,结合__builtin_expect可兼容旧编译器,常用于错误处理、空指针检查等场景,正确使用可提升性能。 在C++中,特别是在对性能要求较高的场景下,分支预测优化可以帮助编译器生成…

    2025年12月18日
    000
  • C++智能指针数组 unique_ptr数组特化

    使用std::unique_ptr可安全管理动态数组,避免内存泄漏。它自动调用delete[],支持下标访问与移动语义,不支持拷贝和指针算术,需配合make_unique使用,适用于轻量级数组管理场景。 在C++中,std::unique_ptr 是用于管理动态分配对象的智能指针,提供独占所有权语义…

    2025年12月18日
    000
  • C++内存重释放问题 双重释放风险防范

    答案:智能指针能显著降低但不能完全杜绝内存重释放风险。通过自动释放、所有权管理和避免悬挂指针,std::unique_ptr和std::shared_ptr可有效防止重复释放;但循环引用(可用std::weak_ptr解决)、自定义删除器错误、与裸指针混用、多线程竞争及不完整类型等问题仍可能导致内存…

    2025年12月18日
    000
  • C++内存模型演进 C++11到C++20改进

    C++11内存模型的核心是通过std::atomic和std::memory_order定义多线程下内存操作的可见性与顺序性,建立happens-before关系以避免数据竞争,确保程序正确性和可移植性。 C++内存模型自C++11引入以来,为多线程编程提供了正式且跨平台的语义基础,极大地解决了此前…

    2025年12月18日
    000
  • C++成员访问控制 public private protected区别

    public成员可被类内、类外和派生类访问;private成员仅类内可访问;protected成员类内和派生类可访问,类外不可访问;继承方式影响基类成员在派生类中的访问权限。 在C++中,public、private 和 protected 是类成员的访问控制符,用于控制类成员(变量、函数)在不同上…

    2025年12月18日
    000
  • C++文件缓冲区刷新 flush同步时机选择

    刷新文件缓冲区是为了确保数据持久化,防止程序崩溃导致数据丢失。应在关键数据写入后、程序结束前、需与其他进程同步或调试时手动刷新;而在性能敏感场景、日志记录或写入临时数据时应避免频繁刷新。选择策略需权衡安全与性能,可结合自动刷新、增大缓冲区或异步写入。若刷新失败,应检查流状态,记录日志,有限重试,必要…

    2025年12月18日
    000
  • make_shared和直接new shared_ptr有什么区别 性能与异常安全对比

    c++++中make_shared比直接new创建shared_ptr更高效且异常安全。1.性能方面:make_shared一次性分配内存用于对象和控制块,减少内存分配次数;而new需两次独立分配,效率较低。2.异常安全方面:使用make_shared时若构造抛出异常不会导致资源泄漏,而new可能引…

    2025年12月18日 好文分享
    000
  • 如何配置C++性能分析工具 Perf和VTune使用

    配置Perf和VTune需安装并设置权限,确保编译含-g调试信息,调整kernel.perf_event_paranoid=-1以解决符号缺失;VTune需正确设置环境变量、加载内核模块并检查权限与防火墙,更新版本或查日志排错;分析多线程程序时用-t指定TID、生成火焰图、命名线程、监测锁竞争及调节…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信