c++学习(智能指针)[29]
RALL




RALL(Resource Acquisition Is Initialization)是一种 C++ 的编程技术,用于管理资源的获取和释放。它的基本思想是在对象的构造函数中获取资源,在对象的析构函数中释放资源,从而确保资源的正确获取和释放。
RALL 的主要优点是可以避免资源泄漏和忘记释放资源的问题,提高代码的可靠性和可维护性。它适用于任何需要手动管理资源的情况,如文件句柄、内存分配、数据库连接等。
下面是一个使用 RALL 技术的示例:
#include <iostream>
#include <fstream>class File {
public:File(const std::string& filename) : m_file(filename) {if (!m_file.is_open()) {throw std::runtime_error("Failed to open file");}}~File() {if (m_file.is_open()) {m_file.close();}}void write(const std::string& data) {m_file << data;}private:std::ofstream m_file;
};int main() {try {File file("data.txt");file.write("Hello, world!");} catch (const std::exception& e) {std::cout << "Error: " << e.what() << std::endl;}return 0;
}
在上面的示例中,我们定义了一个名为 File 的类,用于管理文件资源。在构造函数中,我们尝试打开指定的文件,如果打开失败,则抛出异常。在析构函数中,我们关闭文件。这样,无论是正常执行还是发生异常,都能确保文件资源被正确释放。
在 main 函数中,我们创建了一个 File 对象 file,并调用其 write 函数写入数据到文件中。如果在构造函数中打开文件失败,将会抛出异常,并在 catch 块中打印错误信息。
通过使用 RALL 技术,我们可以在对象的构造函数中获取资源,在析构函数中释放资源,从而避免了显式地调用获取和释放资源的函数,提高了代码的可靠性。
auto_ptr
资源管理权转移,不负责任的拷贝,导致拷贝对象悬空
auto_ptr 是 C++98 中的一个智能指针类,用于管理动态分配的对象。它的主要特点是在对象销毁时自动释放所管理的内存,从而避免了手动调用 delete 来释放内存的问题。
然而,auto_ptr 存在一些问题和限制,因此在 C++11 中被弃用,并推荐使用更安全和灵活的智能指针类 unique_ptr、shared_ptr 和 weak_ptr。
下面是一个使用 auto_ptr 的示例:
#include <iostream>
#include <memory>int main() {std::auto_ptr<int> p(new int(10));std::cout << *p << std::endl;p.reset(new int(20));std::cout << *p << std::endl;return 0;
}
在上面的示例中,我们创建了一个 auto_ptr<int> 对象 p,并将其初始化为一个动态分配的整数对象。通过 *p,我们可以访问所管理的整数对象的值,并输出到控制台。
然后,我们调用 p.reset(new int(20)),将 p 重新指向一个新的动态分配的整数对象。再次通过 *p,我们可以访问新的整数对象的值,并输出到控制台。
在这个示例中,auto_ptr 确实可以自动释放所管理的内存(无需显示调用),但它存在一些问题。首先,它使用的是 delete 而不是 delete[] 来释放内存,因此不适用于管理动态分配的数组。其次,它的拷贝语义是通过所有权转移来实现的,即拷贝后原来的 auto_ptr 将不再拥有所管理的对象,可能导致悬空指针的问题。
因此,建议在 C++11 中使用更安全和灵活的智能指针类 unique_ptr、shared_ptr 和 weak_ptr 来代替 auto_ptr。
标题
相关文章:
c++学习(智能指针)[29]
RALL RALL(Resource Acquisition Is Initialization)是一种 C 的编程技术,用于管理资源的获取和释放。它的基本思想是在对象的构造函数中获取资源,在对象的析构函数中释放资源,从而确保资源的正确获取和释放。 RALL 的…...
B站高播放又涨粉的带货UP主怎么做?
飞瓜数据(B站版)上线新功能【带货达人榜】,由榜单显示,B站7月带货达人中,平均播放量最高的是UP主下个月一定中100万。 带货视频仅1支,播放量已经高达679万,值得一提的是,6月他也是带…...
AD21 PCB设计的高级应用(四)FPGA的管脚交换功能
(四)FPGA的管脚交换功能 高速 PCB 设计过程中,涉及的 FPGA等可编程器件管脚繁多,也因此导致布线的烦琐与困难,Altium Designer 可实现 PCB 中 FPGA 的管脚交换,方便走线。 1.FPGA管脚交换的要求 (1)一般情况下,相同电压的 Bank之…...
超低功耗LCD段码屏驱动显示芯片VK1621原厂芯片
型 号:VK1621 / 品 牌:VINKA/永嘉微电 最新年份 VK1621 是一个324的LCD驱动器,可软体程式控制使其适用于多样化的LCD应用线路,仅用到3至4条信号线便可控制LCD驱动器,除此之外也可介由指令使其進入省电模式 M1855 …...
【深入探索Docker】:开启容器化时代的技术奇迹
深入探索Docker 深入探索Docker:开启容器化时代的技术奇迹前言1. 容器化:实现快速部署和可移植性2. 虚拟化:提高安全性和可靠性3. 映像:打包应用及依赖项的模板4. 网络管理:连接容器和主机5. 持久化数据:保…...
【Ajax】笔记-JQuery发送jsonp请求
前端 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>jQuery-jsonp</title><style>#re…...
docker更换数据存储路径
1. 先停掉docker服务 sudo systemctl stop docker 可能会出现的问题: 这样会导致docker关闭失败,解决办法:systemctl stop docker.socket 确保docker关闭: 2.备份现在的 Docker 数据存储目录 /var/lib/docker(默认路径) mv /var/lib/docker /var/lib/…...
GPT告诉你如何延长周末体验
对于常常感到疲劳的打工人和学生党,过周末需要找到一种平衡,既能够休息放松,又能够提升身心能量。以下是一些建议,希望对你有所帮助: 制定休息计划:在周末前,制定一个休息计划,明确…...
一百四十一、Kettle——kettle8.2在Windows本地开启carte服务以及配置子服务器
一、目的 在kettle建好共享资源库后,为了给在服务器上部署kettle的carte服务躺雷,先在Windows本地测试一下怎么玩carte服务 二、Kettle版本以及在Windows本地安装路径 kettle版本是8.2 pdi-ce-8.2.0.0-342 kettle本地安装路径是D:\j…...
你知道充电桩控制主板的结构吗?
你知道充电桩控制主板的结构吗? 你是否曾经遇到过电动车行驶途中突然没电的情况?不用担心,解决这个问题的方法之一就是使用充电桩。那么,控制主板是如何控制充电桩的呢?让我们一起来探究一下。 充电桩控制主板由多种元件组成,包括主控芯片…...
LeetCode 25题:K个一组翻转链表
题目: 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯…...
Day 19 C++ 文件操作
C 文件操作 文件为什么要使用文件文件类型文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本的二进制形式存储在计算机中 操作类型ofstream:写操作ifstream: 读操作fstream : 读写操作 文本文件写文件引入头文件 \&l…...
Nginx源码安装
文章目录 Nginx源码安装注安装pcre库安装openssl库创建用户及用户组安装编译环境解压文件检测环境重要目录检查配置服务启动脚本查看效果: Nginx源码安装 注 本实验基于RHEL73.10.0-327.el7.x86_64,尽量使用RHEL7或CentOS7。 安装pcre库 安装 pere 库…...
【数据结构和算法】--N叉树返回根节点到目标节点的路径
目录 一、前言二、Java代码实现 一、前言 项目中接触一个问题:在大量有父子关系的列表中,需要筛选出特定约束的数据【要求某个目标节点延续到根节点的数据】。这个问题抽象为数据结构,就是:N叉树返回根节点到目标节点的路径 二、…...
Flutter环境搭建踩坑集锦
Flutter 背景准备工作先检查一下自己的电脑,看一下是不是满足配置要求下载安装配置环境下载安装JDK下载安装Android studio下载Flutterflutter doctor故障Android license status unknownNetwork resources 故障 后记 背景 发现一个不错的框架Flutter,听…...
WPF上位机7——MySql
MySql DML语句 db操作、表操作 字段的数据类型 修改表 表的数据操作 DQL语句 数据查询和去重查询 条件查询 模糊查询 聚合查询 分组查询 排序查询 分页查询 DCL语句 函数 字符串处理函数 数值函数 日期函数 流程函数 约束 外键约束 多表查询 内连接 外连接 自连接 子查询 列…...
Linux的基本指令(2)
指令1:man 作用:可以查询linux指令语法内容。 格式: man 指令 安装man指令: yum install -y man-pages 例如: 查询 指令 ls 的语法内容。 man ls 查询 fork 指令的语法内容。 man fork 在man中存在9个手册&…...
mySql-Linux-安装
mySql-Linux-通过YUM安装 下载 yum 源 [rootspark ~]# wget http://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm --2023-07-31 22:51:21-- http://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm 正在解析主机 repo.mysql.com (repo.mysql.com…...
JS实现IOS标准时间(JSON时间格式)格式转yyyy-mm-dd格式
JS实现IOS时间格式转yyyy-mm-dd格式 /*** IOS时间格式转yyyy-mm-dd格式*param iosDate [IOS时间格式]*return {string} [yyyy-mm-dd]**/ const convertIOSDateFormat (iosDate) > {if(!iosDate) {return -;}const date new Date(iosDate);const year date.getFullYear()…...
【Jmeter】 Report Dashboard 生成html图形测试报告
目录 背景 生成图形报告的方式 1、直接使用一个已存在的 CSV文件生成 2、负载测试完成后自动生成 使用示例 报告内容详情 测试报告摘要图 响应时间随时间变化曲线 活跃线程随时间变化曲线 I/O(Bytes)随时间变化曲线(忽略事务控制器示例结果) …...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
