c++怎么使用shared_ptr_C++共享智能指针shared_ptr使用指南

std::shared_ptr通过引用计数管理对象生命周期,需包含头文件并使用C++11及以上版本;推荐用std::make_shared创建,支持共享所有权与自动释放,注意避免循环引用。

c++怎么使用shared_ptr_c++共享智能指针shared_ptr使用指南

在C++中,std::shared_ptr 是一种智能指针,用于实现共享所有权的内存管理。它通过引用计数机制自动管理动态分配对象的生命周期,当最后一个 shared_ptr 指向该对象时,对象会被自动释放,避免内存泄漏。

1. 包含头文件并启用智能指针

使用 shared_ptr 需要包含 头文件:

#include
#include iostream>

确保使用 C++11 或更高版本(shared_ptr 从 C++11 引入)。

2. 创建 shared_ptr 的常用方法

推荐使用 std::make_shared 来创建 shared_ptr,效率更高且更安全:

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

auto ptr1 = std::make_shared(42);
auto ptr2 = std::make_shared(“Hello”);

也可以从裸指针构造(不推荐直接用裸指针,除非必要):

int* raw = new int(10);
std::shared_ptr ptr3(raw); // 注意:不要重复 delete raw

3. 共享所有权与引用计数

多个 shared_ptr 可以指向同一个对象,每增加一个副本,引用计数加1:

auto sp1 = std::make_shared(100);
{
    auto sp2 = sp1; // 引用计数变为2
    std::cout }
// sp2 离开作用域,引用计数减为1

调用 use_count() 可查看当前引用数量(调试用,不要依赖于性能关键代码)。

4. 自动释放资源

当最后一个 shared_ptr 被销毁或重置时,所管理的对象会自动删除:

{    auto data = std::make_shared>();
    data->push_back(1);
    data->push_back(2);
} // data 离开作用域,vector 自动释放

5. 使用 reset() 释放或替换资源

reset() 可以显式释放资源或将指针指向新对象:

auto p = std::make_shared(5);
p.reset(); // 引用计数减1,若为0则释放内存,p 变为 nullptr

auto p1 = std::make_shared(3.14);
p1.reset(new double(2.71)); // 指向新对象,原对象可能被释放

6. 访问对象:解引用和成员访问

shared_ptr 支持类似普通指针的操作:

auto person = std::make_sharedair>(“Alice”, 25);
std::cout first

7. 注意循环引用问题

两个 shared_ptr 相互持有会导致引用计数永不归零,造成内存泄漏。应使用 std::weak_ptr 打破循环:

struct Node {
    std::shared_ptr parent;
    std::weak_ptr child; // 使用 weak_ptr 避免循环};

基本上就这些。合理使用 shared_ptr 能显著提升代码安全性与可维护性。

以上就是c++++怎么使用shared_ptr_C++共享智能指针shared_ptr使用指南的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 00:35:10
下一篇 2025年12月19日 00:51:22

相关推荐

  • 最佳 Python IDE:为您的编码之旅选择完美的环境

    Python 因其简单性、多功能性以及庞大的库和工具生态系统而成为最流行的编程语言之一。选择正确的集成开发环境 (IDE) 可以极大地提高生产力和 Python 编码的易用性。本文将探讨 2024 年最好的 Python IDE,详细分析它们的功能、优点、缺点和理想用例。 目录 为什么要使用 Pyt…

    2025年12月19日
    000
  • typescript 接口组合

    TypeScript 接口组合允许将多个接口组合成一个新的接口,通过 & 运算符连接,提供代码重用、简化和类型安全,用于创建具有多个接口特性的新接口、扩展现有接口或创建复杂类型约束的对象类型。 TypeScript 接口组合 组合接口是一种 TypeScript 特性,它允许您从多个接口创建…

    2025年12月19日
    000
  • AWS 概念指南

    要充分了解AWS,您不需要掌握每项服务。专注于涵盖云计算主要领域的核心服务集,因为这将为您的构建奠定坚实的基础。以下是需要重点关注的关键 AWS 服务和概念的细分,以便更好地理解: 核心计算服务 EC2(弹性计算云):了解如何启动、配置和管理虚拟机。 弹性负载均衡器 (ELB):了解负载均衡以及如何…

    2025年12月19日
    000
  • 如何使用 JavaScript 遍历 JSON 数组?

    在 javascript 中遍历 json 数组 在处理 json 数据时,遍历数组中的元素至关重要。本文将指导您使用 javascript 遍历 json 数组,从而访问和处理其中的数据。 在您的代码示例中,已通过 eval() 函数解析了 info.filelist 中的 json 字符串。要遍…

    2025年12月19日
    000
  • React 中的异步派生

    我们遇到了一个问题,异步很难。 假设您有一个简单的 get api,一个接收 searchtext 作为参数的搜索。您使用您偏好的 http 请求工具调用它并得到一个承诺,它解析为您正在搜索的任何内容的列表。 如何在 react 组件中调用它? 首先,需要注意一件事,我所描述的可以建模为: resu…

    2025年12月19日
    000
  • React 模块化简介:AMD 和 CommonJS 模块化

    模块化是现代应用程序开发的核心,尤其是在使用像 react 这样的库时。了解模块化和不同的模块化方法(例如 amd 和 commonjs)是开发高效、可维护和可扩展代码的关键。在这篇博文中,我们将探讨模块化在 react 应用程序中的工作原理、为什么它很重要,以及 amd 和 commonjs 的模…

    2025年12月19日
    000
  • 微信小程序中如何实现多个输入框的值相加?

    小程序实现输入框值相加 在微信小程序中,当您有多个输入框需要实现值相加功能时,可以使用以下方法: page({ data: { inputs: [{ value: ” }, { value: ” }, …], // 存放输入框值 result: 0 // 保存相加结果 }, bindinpu…

    2025年12月19日
    000
  • 您需要探索的有趣的新 Github 存储库

    如果您像我一样,总是在 GitHub 上寻找酷炫的新项目来深入研究,那么您将会大饱口福!我收集了五个目前正在掀起波澜的杰出存储库 – 无论您是喜欢聊天机器人构建器、下一代 CRM、文档解析还是可视化云架构,每个人都可以在这里找到一些东西。让我们一起探索吧! 1.六角机器人 Hexabot…

    2025年12月19日
    000
  • 如何使用百度 Echarts 设置不同点颜色?

    百度 echarts不同点颜色设置 本文针对百度 echarts 点的不同颜色设置问题进行解答。 示例:(并非广告) [echarts 示例](http://echarts.baidu.com/examples/editor.html?c=effectscatter-bmap) 如图所示,如何实现不…

    2025年12月19日
    000
  • 为什么JavaScript闭包会导致按钮点击事件输出相同索引值?

    点击按钮隐藏对应序号li的问题与解决 在html中,定义一个带6个lis的ul列表,并给每个li设置不同颜色的背景。此外,还定义了6个按钮,每个按钮对应一个特定的背景色。 在javascript中,获取所有按钮和lis的引用,并为每个按钮添加一个点击事件监听器。在点击事件处理程序中,遍历lis,并在…

    2025年12月19日
    000
  • JS 表单非空验证后无法获取焦点,如何解决?

    js 表单非空验证后无法获取焦点 在进行 js 表单非空验证时,如果出现提交表单后,提示手机号为空但仍然通过的情况,可能是由于获取手机号码的值时存在问题。 解决方法: 检查代码是否正确获取到了手机号的值。可以使用 console.write 检查获取的值是否存在。确保非空验证代码在提交表单之前执行。…

    2025年12月19日
    000
  • 如何使用 ag-grid 轻松处理前端表格中的嵌套行?

    前端嵌套表格行处理利器 在处理前端表格时,嵌套行往往会带来挑战。本文将为大家推荐一款强大的工具:ag-grid。 ag-grid 的优势 ag-grid 是一款功能丰富的 javascript 数据表格库,专为处理复杂表格设计而打造。它提供了对嵌套行的原生支持,让你轻松创建和管理层次结构化的表格。 …

    2025年12月19日
    000
  • 使用生成式 AI 进行 MarkoJS 前端开发:现代方法

    在不断发展的 Web 开发中,MarkoJS 作为最强大的前端框架之一占据了中心舞台,提供了独特的功能,例如在编译时服务器端渲染 HTML 并大大简化了反应式组件。将此与生成式 AI 的新功能相结合,MarkoJS 巩固了其在满足开发人员创建现代、高效和动态 Web 应用程序方面的需求的地位。 在本…

    2025年12月19日
    000
  • Nodejs 中的日志记录和监控:最佳实践

    有效的日志记录和监控对于维护应用程序运行状况、快速识别问题和提高性能至关重要。在本文中,我们将深入探讨 node.js 应用程序的日志记录和监控,涵盖选择日志记录级别、设置结构化日志、与监控工具集成以及使用 winston 和 elasticsearch 的最佳实践等关键主题。 日志记录和监控简介 …

    2025年12月19日
    000
  • 如何使用 React 和 Rest API 构建网站(React 基础知识解释)

    react 和 typescript 是用于构建可扩展、可维护和安全网站的强大框架。 react 提供了灵活且基于组件的架构,而 typescript 在 javascript 中添加了静态类型,以实现干净且可读的代码。本文将指导您使用 react 和 typescript 设置一个简单的网站,涵盖…

    2025年12月19日 好文分享
    000
  • 为什么这段 JavaScript 代码中的 `i` 始终输出 6?

    js 闭包问题 给定以下代码: document ul li:nth-child(1) { background: #00ffff; } ul li:nth-child(2) { background: #0011ff; } ul li:nth-child(3) { background: #ff0…

    2025年12月19日
    000
  • 为什么 JavaScript 闭包会自动捕获变量,以及如何解决循环中闭包自动捕获变量带来的问题?

    关于 javascript 闭包自动捕获变量的理解 问题描述: 以下代码中,单击按钮时,控制台输出的是一个固定值 6,而不是预期的按钮索引: var oinput = document.getelementsbytagname(“input”); var oli = document.getelem…

    2025年12月19日
    000
  • 微信小程序输入框如何实现值相加并实时显示?

    如何让微信小程序中输入框的值与下一个相加并显示 在微信小程序中,当用户在多个输入框中输入值时,需要保存这些值并根据要求进行计算,如将其相加。以下是如何实现这一目标: 第一步:在输入框上绑定 bindchange 事件。该事件会在输入框值发生变化时触发。 第二步:在 bindchange 事件处理函数…

    2025年12月19日
    000
  • 使用变更集管理您的版本控制和变更日志

    本文概述了变更集及其在 t3-env 中的用法。 什么是变更集? 这是变更集存储库自述文件中提供的官方定义。 变更集工作流程旨在帮助人们进行更改,一直到发布。它让贡献者声明如何发布他们的更改,然后我们自动更新包版本和更改日志,并根据提供的信息发布新版本的包。 changesets 专注于解决多包存储…

    2025年12月19日
    000
  • 使用 Zod 和 Faker 构建用于生成模拟数据的 TypeScript 助手

    构建应用程序时,模拟数据对于测试、开发和原型设计非常宝贵。借助 zod 强大的模式验证和 faker 的数据生成功能,我们可以创建一个强大的助手来为任何 zod 模式生成真实的、符合模式的模拟数据。 介绍 在本指南中,我们将创建一个辅助函数generatemockdatafromschema,它接受…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信