怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析

c++++中的智能指针用于管理动态内存,避免内存泄漏和手动delete的问题。最常用的两种是unique_ptr和shared_ptr。1. unique_ptr独占资源所有权,不可复制但可转移,适合单一指针管理资源的场景;2. shared_ptr采用引用计数,允许多个指针共享资源,适合资源共享或生命周期不确定的情况。选择时根据资源是否需要共享决定,同时注意循环引用问题,推荐使用make_unique和make_shared创建,并避免用裸指针初始化多个智能指针。

怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析

智能指针是C++中非常实用的工具,尤其在管理动态内存方面。它们能帮助我们避免内存泄漏和手动delete带来的问题。STL中的unique_ptr和shared_ptr是最常用的两种智能指针,它们各自有不同的使用场景和特点。

怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析

unique_ptr:独占所有权

unique_ptr 的最大特点是独占资源所有权。也就是说,同一时间只能有一个 unique_ptr 指向某个对象,不能复制,但可以转移(move)所有权。

怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析

适合场景:

你希望某个资源只能被一个指针管理。需要明确资源生命周期,避免多个指针同时访问造成混乱。在类内部封装资源时,确保外部无法随意共享或拷贝。

使用建议:

怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析创建方式通常为 std::make_unique(),简洁又安全。不要尝试拷贝 unique_ptr,会编译报错。可以通过 std::move() 把资源转移到另一个 unique_ptr 中。

举个例子:

auto ptr1 = std::make_unique(10);// auto ptr2 = ptr1; // 编译错误!不能拷贝auto ptr2 = std::move(ptr1); // 正确,ptr1现在为空

shared_ptr:共享所有权

shared_ptr引用计数型智能指针,多个 shared_ptr 可以指向同一个对象,当最后一个指向它的指针被销毁时,资源才会释放。

适合场景:

多个对象需要共享一个资源,比如共享缓存、配置数据等。资源的生命周期不确定,由所有持有者共同决定。回调机制中传递资源,避免提前释放。

使用建议:

推荐使用 std::make_shared() 创建,效率更高。注意循环引用问题,可能导致内存泄漏。可以用 weak_ptr 来打破循环依赖。

例如:

auto sp1 = std::make_shared(20);{    auto sp2 = sp1; // 引用计数加1} // sp2离开作用域,引用计数减1,但sp1还在,资源未释放

如何选择?几个判断点

如果资源只需要被一个地方使用,并且生命周期清晰,优先选 unique_ptr。如果多个地方需要共享资源,或者不确定谁最后释放,就用 shared_ptr。尽量避免裸指针 new/delete,交给智能指针处理。如果有父子结构、树形结构等容易形成循环引用的地方,记得搭配 weak_ptr 使用。

小细节注意

make_uniquemake_shared 不仅写法简单,还能避免异常安全问题。不要用同一个裸指针初始化多个智能指针,这样会导致重复释放。对于数组资源,unique_ptr 支持数组形式 unique_ptr,而 shared_ptr 需要自定义删除器。

基本上就这些。合理使用智能指针,能大大提升代码的安全性和可维护性。

以上就是怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 16:29:20
下一篇 2025年12月18日 16:29:28

相关推荐

  • 您不需要 CSS 预处理器

    原生 css 在最近几个月/几年里取得了长足的进步。在这篇文章中,我将回顾人们使用 sass、less 和 stylus 等 css 预处理器的主要原因,并向您展示如何使用原生 css 完成这些相同的事情。 分隔文件 分离文件是人们使用预处理器的主要原因之一。尽管您已经能够将另一个文件导入到 css…

    2025年12月24日
    000
  • React 嵌套组件中,CSS 样式会互相影响吗?

    react 嵌套组件 css 穿透影响 在 react 中,嵌套组件的 css 样式是否会相互影响,取决于采用的 css 解决方案。 传统 css 如果使用传统的 css,在嵌套组件中定义的样式可能会穿透影响到父组件。例如,在给出的代码中: 立即学习“前端免费学习笔记(深入)”; component…

    2025年12月24日
    000
  • React 嵌套组件中父组件 CSS 修饰会影响子组件样式吗?

    对嵌套组件的 CSS 修饰是否影响子组件样式 提问: 在 React 中,如果对嵌套组件 ComponentA 配置 CSS 修饰,是否会影响到其子组件 ComponentB 的样式?ComponentA 是由 HTML 元素(如 div)组成的。 回答: 立即学习“前端免费学习笔记(深入)”; 在…

    2025年12月24日
    000
  • 构建模拟:从头开始的实时交易模拟器

    简介 嘿,开发社区!我很高兴分享我的业余项目 Simul8or – 一个实时日间交易模拟器,旨在为用户提供一个无风险的环境来练习交易策略。该项目 100% 构建在 ASP.NET WebForms、C#、JavaScript、CSS 和 SQL Server 技术堆栈上,没有外部库或框架。从头开始构…

    2025年12月24日
    300
  • 在 React 项目中实现 CSS 模块

    react 中的 css 模块是一种通过自动生成唯一的类名来确定 css 范围的方法。这可以防止大型应用程序中的类名冲突并允许模块化样式。以下是在 react 项目中使用 css 模块的方法: 1. 设置 默认情况下,react 支持 css 模块。你只需要用扩展名 .module.css 命名你的…

    2025年12月24日
    000
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • action在css中的用法

    CSS 中 action 关键字用于定义鼠标悬停或激活元素时的行为,语法:element:action { style-property: value; }。它可以应用于 :hover 和 :active 伪类,用于创建交互效果,如更改元素外观、显示隐藏元素或启动动画。 action 在 CSS 中…

    2025年12月24日
    000
  • css规则的类型有哪些

    CSS 规则包括:通用规则:选择所有元素类型选择器:根据元素类型选择元素类选择器:根据元素的 class 属性选择元素ID 选择器:根据元素的 id 属性选择元素(唯一)后代选择器:选择特定父元素内的元素子选择器:选择作为特定父元素的直接子元素的元素伪类:基于元素的状态或特性选择元素伪元素:创建元素…

    2025年12月24日
    000
  • 探究回流与重绘的异同及适用领域

    深入探讨回流与重绘:差异和应用场景,需要具体代码示例 前言: 在前端开发中,回流(reflow)和重绘(repaint)是常见的概念。它们与页面渲染密切相关,对性能优化至关重要。本文将深入探讨回流和重绘的差异以及它们的应用场景,并给出具体的代码示例。 一、回流(reflow)是什么? 回流指的是浏览…

    2025年12月24日
    000
  • 绝对定位策略的要求和适用情景

    绝对定位策略的要求及应用场景,需要具体代码示例 摘要:绝对定位(Absolute positioning)是前端开发中常用的一种布局策略。本文将介绍绝对定位的要求、应用场景,并给出具体的代码示例,帮助读者更好地理解和运用这一策略。 一、绝对定位的要求绝对定位是指通过设置元素的 position 属性…

    2025年12月24日
    000
  • 探析CSS框架与排版的异同及运用场景

    CSS框架与排版的区别及应用场景探析 CSS框架和排版是前端开发中经常使用的两个概念。虽然它们都涉及到网页布局和样式的处理,但是在具体的实践过程中,它们有着不同的作用和应用场景。本文将探讨CSS框架和排版的区别,并提供一些具体的代码示例。 一、CSS框架的概念和应用场景 CSS框架是一种基于CSS编…

    2025年12月24日
    000
  • 响应式布局的优点及适用范围

    响应式布局的优势及其应用场景 随着移动设备的普及和多样化,人们对于网站的访问方式也发生了变化。为了适应不同屏幕尺寸和分辨率的设备,响应式布局(Responsive Design)成为了一种非常重要的设计和开发技术。本文将探讨响应式布局的优势及其在实际应用中的场景,并提供相关的代码示例。 一、响应式布…

    2025年12月24日 好文分享
    000
  • 探索CSS伪类与伪元素的基础概念和使用场景

    了解CSS伪类和伪元素的基本概念及应用场景 CSS(Cascading Style Sheets)是一种用于描述网页样式的标记语言,它可以控制网页中的元素的外观和布局。在CSS中,伪类和伪元素是非常有用的功能,可以进一步扩展CSS的应用范围和灵活性。 一、伪类 伪类是用于选择特定状态元素的关键词。常…

    2025年12月24日
    000
  • 实现CSS :nth-child(even)伪类选择器的多种应用场景

    实现CSS :nth-child(even)伪类选择器的多种应用场景,需要具体代码示例 CSS中的伪类选择器是一种强大的工具,可以在页面中选择元素的特定状态或位置。其中,:nth-child(even)伪类选择器用于选择指定父元素下的偶数位置的子元素。它的使用方法如下: 父元素:nth-child(…

    2025年12月24日
    000
  • 实现CSS :nth-last-child伪类选择器的各种应用场景

    实现CSS :nth-last-child伪类选择器的各种应用场景,需要具体代码示例 在CSS中,有很多伪类选择器可以帮助我们更精确地选择和样式化HTML元素。其中,:nth-last-child伪类选择器就是一个非常强大和实用的选择器,它可以根据元素在父元素中的位置来选择特定的元素。在本文中,我们…

    2025年12月24日
    000
  • 实现CSS :nth-last-child(-n+4)伪类选择器的多种应用场景

    实现CSS :nth-last-child(-n+4)伪类选择器的多种应用场景,需要具体代码示例 CSS的伪类选择器为我们提供了很多方便的选择元素的方式。其中,:nth-last-child(-n+4)伪类选择器是一种非常有用的选择器,它可以选择倒数第4个及其之后的所有元素。这种选择器在实际开发中有…

    2025年12月24日
    000
  • 实现CSS :target伪类选择器的各种应用场景

    实现CSS :target伪类选择器的各种应用场景,需要具体代码示例 CSS : target 伪类选择器是一种常用的CSS选择器,它可以根据URL中的锚点(#)来选择特定的元素。在本文中,我们将介绍一些使用该伪类选择器的实际应用场景,并提供相应的代码示例。 页面内导航链接样式切换: 当用户点击页面…

    2025年12月24日
    000
  • 实现CSS :empty伪类选择器的多种应用场景

    实现CSS :empty伪类选择器的多种应用场景,需要具体代码示例 CSS是一种用于控制网页样式的语言,可以通过选择器来选择文档中的元素并对其进行样式控制。其中,:empty伪类选择器用于选择没有子元素的元素。本文将介绍:empty伪类选择器的多种应用场景,并提供具体的代码示例。 隐藏空元素 通过使…

    2025年12月24日
    000
  • 实现CSS :nth-last-of-type(4n)伪类选择器的多种应用场景

    实现CSS :nth-last-of-type(4n)伪类选择器的多种应用场景,需要具体代码示例 在CSS中,伪类选择器是一种非常强大的工具,可以帮助我们更精确地选择DOM元素并对其样式进行控制。其中,:nth-last-of-type(4n)伪类选择器是一种特殊的选择器,可以选择倒数第四个兄弟元素…

    2025年12月24日
    000
  • 详解Css Flex 弹性布局中的对齐方式及其应用场景

    详解CSS Flex 弹性布局中的对齐方式及其应用场景 在Web开发中,CSS Flex 弹性布局已经成为一种非常常见且实用的布局方式。它提供了一套灵活的布局模型,可以轻松实现各种不同屏幕尺寸和设备上的页面布局。除了灵活性,CSS Flex 还提供了对齐方式的多样性,这使得我们能够更好地控制和调整布…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信