什么是 C++ 中的智能指针?有哪些类型的智能指针?

智能指针的定义

在 C++ 中,智能指针是一种类模板,用于管理动态分配的内存。它的主要目的是自动管理内存的生命周期,避免手动释放内存时可能出现的错误,如内存泄漏(忘记释放内存)和悬空指针(访问已释放的内存)。智能指针通过重载*(解引用运算符)和->(成员访问运算符)等运算符,使得它在行为上类似于普通指针,但又具有自动内存管理的功能。

例如,在没有智能指针的情况下,使用普通指针分配内存如下:

int* ptr = new int;
// 使用ptr
delete ptr;  // 需要手动释放内存,如果忘记就会导致内存泄漏

而智能指针可以自动处理内存的释放,减少这种错误的发生。

智能指针的类型

std::unique_ptr独占所有权:

std::unique_ptr是一种独占式智能指针,它所管理的对象只能有一个unique_ptr与之关联。这意味着当一个unique_ptr拥有一个对象的所有权时,其他unique_ptr不能同时拥有该对象。

示例:

#include <memory>
int main() {std::unique_ptr<int> ptr1 = std::make_unique<int>(5);// std::unique_ptr<int> ptr2 = ptr1;  // 这是错误的,不能复制unique_ptrstd::unique_ptr<int> ptr3 = std::move(ptr1);  // 通过移动语义转移所有权return 0;
}

资源所有权转移:

它通过移动语义(std::move函数)来转移资源的所有权。当一个unique_ptr被移动到另一个unique_ptr后,原来的unique_ptr就不再拥有该资源,其内部指针变为nullptr。这种机制保证了对象的独占性,并且符合 C++ 的零开销原则,因为没有额外的引用计数等开销。

std::shared_ptr共享所有权:

std::shared_ptr实现了共享式的所有权管理。多个shared_ptr可以同时指向同一个对象,对象的生命周期会一直持续到最后一个指向它的shared_ptr被销毁。

引用计数机制:

它内部使用引用计数来记录有多少个shared_ptr指向同一个对象。每当一个新的shared_ptr指向该对象时,引用计数加 1;当一个shared_ptr被销毁(例如超出作用域)时,引用计数减 1。当引用计数变为 0 时,所管理的对象会被自动删除。

#include <memory>
int main() {std::shared_ptr<int> ptr1 = std::make_shared<int>(10);std::shared_ptr<int> ptr2 = ptr1;  // 共享所有权,引用计数变为2return 0; 
}
// 当main函数结束,ptr1和ptr2都超出作用域,引用计数减为0,对象被自动删除

std::weak_ptr弱引用:

std::weak_ptr是一种弱引用智能指针,它主要用于解决std::shared_ptr可能出现的循环引用问题。weak_ptr不控制对象的生命周期,它只是对一个由shared_ptr管理的对象的弱引用。

与shared_ptr的关系:weak_ptr可以通过lock函数来获取一个指向相同对象的shared_ptr,如果对象已经被释放(引用计数为 0),则lock函数返回一个空的shared_ptr。

循环引用示例及解决方法:

假设有两个类A和B,它们相互包含shared_ptr成员,可能会导致循环引用

class B;
class A {
public:std::shared_ptr<B> b;A() {}~A() {}
};
class B {
public:std::shared_ptr<A> a;B() {}~B() {}
};
int main() {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的引用计数都为2,当main函数结束时,它们的引用计数无法减为0,导致内存泄漏,无法调用a,b的析构函数// 使用weak_ptr解决class B;class A {public:std::weak_ptr<B> b;A() {}~A() {}};class B {public:std::weak_ptr<A> a;B() {}~B() {}};std::shared_ptr<A> a = std::make_shared<A>();std::shared_ptr<B> b = std::make_shared<B>();a->b = b;b->a = a;// 这样就不会出现循环引用导致的内存泄漏问题return 0;
}

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

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

相关文章

Oracle热备过程中对数据库崩溃的处理方法

引言 在热备过程中如果发生数据库崩溃、断电等情况该如何处理? 如果正在备份 users 表空间的数据文件过程中,此时的数据文件表头 SCN 会被锁定,此时正在复制数据文件时数据库崩溃,系统断电。 从而导致数据文件表头与控制文件中的不一致,导致数据库无法打开,会要求介质恢…

Python操作neo4j库py2neo使用之创建和查询(二)

Python操作neo4j库py2neo使用之创建和查询&#xff08;二&#xff09; py2neo 创建操作 1、连接数据库 from py2neo import Graph graph Graph("bolt://100.100.20.55:7687", auth(user, pwd), nameneo4j)2、创建Node from py2neo import Node, Subgraph # 创建…

Elasticsearch面试内容整理-高级特性

Elasticsearch 提供了一系列高级特性,这些特性可以极大地增强其搜索、分析和管理能力,使得它在大数据场景中表现出色。以下是 Elasticsearch 的一些重要高级特性: 近实时搜索(Near Real-Time Search) Elasticsearch 的一个关键特性是 近实时搜索(NRT),这意味着数据写入…

算法专题十一: 基础递归

目录 1. 汉诺塔2. 合并两个有序链表3. 反转链表4. 两两交换链表中的节点5. Pow(x, n) 1. 汉诺塔 题目链接&#xff1a; Leetcode汉诺塔 算法原理&#xff1a; 递归&#xff1a;宏观视角理解递归 本道题为什么能用递归&#xff1f; 让我们逐一分析 首先思考我们如何来解决汉诺…

Cmakelist.txt之win-c-udp-client

1.cmakelist.txt cmake_minimum_required(VERSION 3.16) ​ project(c_udp_client LANGUAGES C) ​ add_executable(c_udp_client main.c) ​ target_link_libraries(c_udp_client wsock32) ​ ​ include(GNUInstallDirs) install(TARGETS c_udp_clientLIBRARY DESTINATION $…

Git错误:gnutls_handshake() failed: The TLS connection was non-properly terminated

最终我通过这个博客解决了问题&#xff1a;解决Git错误&#xff1a;gnutls_handshake() failed: The TLS connection was non-properly terminated 解决方案 1. 检查网络连接 首先&#xff0c;确保你的网络连接是稳定的。尝试访问其他HTTPS网站或服务&#xff0c;以排除网络问…

用Python做一个websocket服务端

我对websocket服务端的功能定义是&#xff1a; 1.能将client端的软硬件信息关联&#xff08;如client_name和对应ip:port&#xff09;&#xff0c;且不支持重复关联; 2.可以判断接收自client端的消息属于哪种任务&#xff0c;并对应执行&#xff08;如关联、发消息&#xff0…

Lua如何连接MySQL数据库?

大家好&#xff0c;我是袁庭新。使用Lua语言如何来连接数据库呢&#xff1f;新哥这篇文章给你安排上。 1 LuaSQL概述 LuaSQL是一个轻量级的Lua到数据库管理系统&#xff08;DBMS&#xff09;的接口库&#xff0c;由Kepler Project维护&#xff0c;且是开源的。它提供了一个简…

机器学习基础07

目录 1.逻辑回归 1.1原理 1.2API 2.K-Means 2.1算法过程 2.2API 3.SVM&#xff08;支持向量机&#xff09; 3.1算法原理​ 3.2API 1.逻辑回归 逻辑回归(Logistic Regression)是机器学习中的一种分类模型&#xff0c;逻辑回归是一种分类算法。 1.1原理 逻辑回归的输…

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1&#xff1a; 本月11号官宣&#xff1a;针对所有人免费提供&#xff0c;包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后&#xff0c;双击默认安装即可&#xff1a; 一路单击下一步按钮&#xff1a; 等待…

解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“

最近给电脑做了新版的 Windows 11 LTSC操作系统&#xff0c;在启动VMware Workstation时&#xff0c;提示"此虚拟机已启用侧通道缓解&#xff0c;可增强安全性&#xff0c;但也会降低性能"&#xff0c;但是我没有启用 Hyper-V 相关的任何功能以及 WSL&#xff0c; 从…

Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找

目录 一&#xff0c;数组翻转 二&#xff0c;冒泡排序 三&#xff0c;二分查找&#xff08;一尺之锤&#xff0c;日取其半&#xff0c;万世不竭&#xff09; 一&#xff0c;数组翻转 1.概述:数组对称索引位置上的元素互换&#xff0c;最大值数组序号是数组长度减一 创建跳板…

数据结构-7.Java. 对象的比较

本篇博客给大家带来的是java对象的比较的知识点, 其中包括 用户自定义类型比较, PriorityQueue的比较方式, 三种比较方法...... 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 .…

悬浮框元素定位

Web页面中调试悬浮元素的方法 在UI自动化测试或Web开发中&#xff0c;悬浮框的特点是鼠标进入时弹出&#xff0c;鼠标离开时消失。这种动态特性导致普通方法难以直接定位悬浮框内的元素。所以需要冻结页面或使用模拟Hover状态来进行调试。 方法一&#xff1a;冻结页面进行调试…

IDEA算法的详细介绍及Python实现

目录 IDEA算法的详细介绍及Python实现引言第一部分:IDEA算法的原理与背景1.1 IDEA算法的来源与特点1.2 IDEA算法的核心步骤第二部分:IDEA算法的Python实现(面向对象设计)2.1 核心类设计2.2 代码实现2.3 使用示例第三部分:案例1 - 函数优化问题(策略模式)3.1 问题描述3.2…

「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解

本篇将详细介绍 Cangjie 中的浮点类型&#xff0c;包括浮点数的表示方法、精度、舍入与溢出处理、科学计数法表示、字面量的进制表示、常用运算、类型转换及应用场景&#xff0c;帮助开发者掌握浮点数的使用方法。 关键词 浮点类型表示精度与舍入溢出与下溢科学计数法类型转换…

MAC借助终端上传jar包到云服务器

前提&#xff1a;保证工程本地已打包完成&#xff1a;图中路径即为项目的target目录下已准备好的jar包 第一步&#xff1a;打开终端&#xff08;先不要连接自己的服务器&#xff09;&#xff0c;输入下面的上传命令&#xff1a; scp /path/to/local/app.jar username192.168.1…

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…

基于Python Web的社区爱心养老管理系统设计与实现

摘 要 随着社会老龄化的加剧&#xff0c;养老问题日益凸显。为了解决社区养老服务的管理难题&#xff0c;本文提出了一种基于互联网技术的社区爱心养老管理系统。该系统采用B/S架构&#xff0c;结合Web前端技术和后端数据库技术&#xff0c;实现了对社区养老服务的全面管理。系…

在 Ubuntu 上使用 Traefik Proxy 为 Docker 容器设置反向代理

简介 Traefik&#xff08;发音为"traffic"&#xff09;是一个开源的反向代理和负载均衡器。它为微服务架构提供了网络入口&#xff0c;特别是在动态、服务密集的环境中&#xff08;如容器、微服务架构&#xff09;。由于其设计灵活且易于实施&#xff0c;Traefik 成…