智能指针(Smart Pointers)

定义

智能指针(Smart Pointers)是C++中的一种高级特性,它提供了一种自动管理动态分配内存的机制。通过智能指针,开发者可以避免手动管理内存所带来的问题,如内存泄漏和悬挂指针等。智能指针的主要目的是确保当对象不再需要时,其内存能够被自动释放。

C++标准库提供了几种智能指针类型,包括std::unique_ptrstd::shared_ptrstd::weak_ptrstd::auto_ptr(注意,std::auto_ptr在C++11中已被弃用,并在C++17中被移除)。

示例

std::unique_ptr

std::unique_ptr是一个独占所有权的智能指针。它拥有它所指向的对象,并且该对象在同一时间只能被一个unique_ptr拥有。当unique_ptr被销毁(例如离开其作用域)时,它所指向的对象也会被自动删除。

#include <memory>  void foo() {  std::unique_ptr<int> ptr(new int(42)); // 分配内存  // 使用 ptr...  // 当 ptr 离开作用域时,它所指向的内存会被自动释放  
}

std::shared_ptr

std::shared_ptr允许多个智能指针共享同一个对象的所有权。内部使用引用计数来追踪共享对象的所有权。当最后一个shared_ptr被销毁时,它所指向的对象才会被删除。

#include <memory>  void bar() {  std::shared_ptr<int> sptr1(new int(42)); // 分配内存  std::shared_ptr<int> sptr2 = sptr1; // 复制构造,增加引用计数  // 当 sptr1 和 sptr2 都离开作用域时,内存才会被释放  
}

std::weak_ptr

std::weak_ptr是一种不控制对象生命周期的智能指针,它指向一个由shared_ptr管理的对象。weak_ptr用于解决shared_ptr之间的循环引用问题。

#include <memory>  struct A;  
struct B;  struct A {  std::shared_ptr<B> b;  ~A() {}  
};  struct B {  std::weak_ptr<A> a;  ~B() {}  
};  void baz() {  std::shared_ptr<A> a = std::make_shared<A>();  std::shared_ptr<B> b = std::make_shared<B>();  a->b = b;  b->a = a;  // 当 a 和 b 离开作用域时,内存会被正确释放,即使存在循环引用  
}

std::auto_ptr(已弃用)

std::auto_ptr是一个早期的智能指针实现,它在C++98中被引入,但在C++11中被标记为弃用,并在C++17中被移除。auto_ptr有一个所有权转移语义,这意味着当auto_ptr被复制时,所有权会从源auto_ptr转移到目标auto_ptr,源auto_ptr会失去所有权并变为空。由于这个所有权转移语义,auto_ptr在使用上容易导致混淆和错误,因此被unique_ptrshared_ptr所取代。

智能指针的优缺点

优点:

  • 自动管理内存,减少内存泄漏和悬挂指针的风险。
  • 简化内存管理代码,提高代码的可读性和可维护性。
  • 提供了多种所有权模型,适应不同的使用场景。

缺点:

  • 智能指针的使用可能会引入额外的性能开销(尽管通常这些开销是微不足道的)。
  • 需要正确理解和使用智能指针的所有权模型,以避免出现意外的行为。

总的来说,智能指针是C++中一个非常重要的特性,它帮助开发者更加安全和高效地管理动态内存。在选择使用哪种智能指针时,应该根据具体的使用场景和需求来做出决策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【力扣hot100】刷题笔记Day17

前言 今天竟然不用开组会&#xff01;天大的好消息&#xff0c;安心刷题了 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 回溯&#xff08;排列&#xff09; class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 回溯def backtrack():if len(…

C++学习第四天(类与对象下)

1、构造函数的其他知识 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值 构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成员变量的初始化&#xff0c;构造函…

Nginx+keepalived 高可用高性能

什么是高可用: 在使用 Nginx 做反向代理或者负载均衡的时候,都是以 Nginx 为入口,如果 Nginx 宕机了,那么所有的服务都无法正常提供,影响非常严重。所有我们需要保证 nginx 高可用,就是配置备份机,前一个挂了,还有后一个。 为了避免负载均衡服务器宕机造成严重影响,…

关于游戏报错提示x3daudio1_7.dll丢失怎么修复?多个实测有效方法分享

x3daudio1_7.dll 是一个与 Microsoft DirectX 相关的重要动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它主要服务于Windows操作系统下的多媒体和游戏应用程序。 一、以下是关于 x3daudio1_7.dll 文件的详细介绍 名称与位置&#xff1a; 文件名&#xff1a;x3daud…

PHP堆栈+errLog定位

调用堆栈&#xff08;Call Stack&#xff09;是一个记录了程序在运行时所有活动子例程的栈结构。它以函数调用的方式描述了程序的执行流程和调用关系。 在PHP中&#xff0c;我们可以通过打印PHP调用堆栈来辅助调试和定位代码中的问题。本文将介绍如何在PHP中打印调用堆栈&…

探秘Python的Pipeline魔法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Pipeline&#xff1f; Pipeline的基本用法 Pipeline的高级用法 1. 动态调参 2. 并行处理 3. 多输出 …

Spring底层源码分析

spring依赖注入底层原理解析 spring之bean对象生命周期步骤详情 流程&#xff1a; UserService.class —>推断构造方法—>普通对象----依赖注入------>初始化&#xff08;afterPropertiesSet方法&#xff09;------>初始化后&#xff08;AOP&#xff09;------…

Zabbix“专家坐诊”第231期问答

问题一 Q&#xff1a;用docker-compose部署zabbix&#xff0c;部署完后如果要修改zabbix的配置应该要改docker-compose文件里的环境变量吧&#xff1f;改了环境变量之后只能重建容器才能生效吗&#xff1f;能不能在不影响已经配好的那些监控项的情况下让新的环境变量生效&#…

洛谷P1331海战

题目背景 在峰会期间&#xff0c;武装部队得处于高度戒备。警察将监视每一条大街&#xff0c;军队将保卫建筑物&#xff0c;领空将布满了 F-2003 飞机。 此外&#xff0c;巡洋船只和舰队将被派去保护海岸线。不幸的是&#xff0c;因为种种原因&#xff0c;国防海军部仅有很少…

win安装卸载python3.13

一、安装 访问python官网&#xff1a;https://www.python.org/ 点击“Downloads” 点击“Windows” 找到自己要下载的版本和位数&#xff0c;比如我这个是3.13版本、64位的安装包 下载好了之后&#xff0c;双击安装包 勾选“Add python.exe to PATH”&#xff1a;把python环…

[记录]-PyCharm中的Unresolved Reference疾病专治

转载https://blog.csdn.net/qq_36166962/article/details/115905359?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170930227516800227476736%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id170930227516800227476736&biz_i…

作业1-224——P1331 海战

思路 深搜的方式&#xff0c;让它只遍历矩形块&#xff0c;然后在下面的遍历中判断是否出现矩形块交叉&#xff0c;但是很难实现&#xff0c;然后发现可以通过在遍历过程中判断是否合法。 参考代码 #include<iostream> #include<cstdio> using namespace std; …

SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突

SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突 &#xff0c;错误如图&#xff1a; 问题原因&#xff1a;不能直接删除作业 任务&#xff0c;需要先删除计划里面的日志、删除代理作业、删除子计划以后才能删除作业。 解…

蓝桥杯:真题讲解3(C++版)附带解析

报纸页数 来自&#xff1a;2016年七届省赛大学C组真题&#xff08;共8道题) 分析&#xff1a; --画出报纸长的样子&#xff0c;如果我们在上面多画一张报纸&#xff0c;那么就符合题意的5&#xff0c;6&#xff0c;11&#xff0c;12。 观察这张图&#xff1a;观察3&#xf…

VUE3子组件实例方法暴露(导出)方法

最近很多朋友私我请教子组件实例的获取方法 解答&#xff1a; vue2中可直接通过父组件内组件的ref读取子组件的实例&#xff0c;vue3有些许区别 vue3中需要在子组件中导出&#xff08;暴露&#xff09;相关实&#xff08;你需要再父组件中调用&#xff09;例方法&#xff1a;…

力扣:35. 搜索插入位置

力扣&#xff1a;35. 搜索插入位置 描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,…

Mybatis | Mybatis的核心配置

目录: Mybatis的核心配置 :一、MyBatis的 “核心对象”1.1 SqlSessionFactory1.2 SqlSession :SqlSession对象中的操作数据库的方法 :\<T> T selectOne ( String statement )\<T> T selectOne( String statement , Object parameter )\<E> List\<E> se…

SpringBoot基于注解实现全局日期格式化

首先根据项目要求提供自定义的日期序列化器和反序列化器&#xff0c;其中包括&#xff1a; DateJsonSerializerextendsJsonSerializer 表示将Date格式化为日期字符串。DateJsonDeserializerextendsJsonDeserializer 表示将日期字符串解析为Date日期。 使用注解 JsonComponent…

openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划

文章目录 openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划 openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划 完成资源负载管理功能配置前&#xff0c;需要先根据业务模型完成租户资源的规划。业…

绍兴市新昌县人大一行莅临迪捷软件走访考察

2024年2月29日下午&#xff0c;绍兴市新昌县人大常委会副主任王敏慧一行莅临迪捷软件走访考察&#xff0c;绍兴市委科创委副主任、科创走廊建设领导小组副组长、市人大一级巡视员王继岗&#xff0c;绍兴市科技局副局长、科创走廊建设办公室常务副主任梁枫陪同。 王主任一行听取…