【C++】编程规范之内存规则
在高质量编程中,内存管理是一个至关重要的方面。主要有以下原则:
内存分配后需要检查是否成功:内存分配可能会失败,特别是在内存紧张的情况下。因此,在分配内存后,应该检查分配是否成功。
int* ptr = new int;
if (ptr == nullptr) {// 内存分配失败的处理逻辑
} else {// 内存分配成功*ptr = 10;
}
指针在申请前和释放后需要置空:为了避免悬挂指针(Dangling Pointer)的问题,申请内存前和释放后应该将指针置为空。
int* ptr = nullptr; // 初始化为空指针ptr = new int;
// 使用ptrdelete ptr;
ptr = nullptr; // 释放内存后将指针置为空
内存使用前需要初始化:在使用动态分配的内存前,应该确保对其进行初始化,以避免访问未初始化的内存导致的未定义行为。
int* ptr = new int;
*ptr = 10; // 初始化内存
// 使用ptrdelete ptr;
自定义类对象和STL对象禁止使用memset/memcpy等内存操作:对于自定义类对象和STL容器等动态分配的内存,应该避免使用memset、memcpy等内存操作函数,而应该使用类的构造函数、赋值运算符等方法来进行内存操作。
#include <vector>class MyClass {
public:MyClass(int val) : value(val) {}
private:int value;
};int main() {std::vector<MyClass> vec;vec.push_back(MyClass(10)); // 正确的内存操作方式// 错误的方式:memset(&vec[0], 0, sizeof(MyClass)); // 禁止使用memsetreturn 0;
}
内存申请和释放需要匹配:确保每次内存分配后都有对应的释放操作,避免内存泄漏。
int* ptr = new int;
// 使用ptrdelete ptr; // 内存释放与分配匹配
资源申请和释放需要匹配:除了内存之外,其他资源如文件、锁等也需要在申请后及时释放,确保资源的正确管理。
#include <fstream>int main() {std::ifstream file("example.txt");if (!file.is_open()) {// 文件打开失败的处理逻辑} else {// 文件打开成功// 使用文件file.close(); // 关闭文件,释放资源}return 0;
}
在复杂的内存管理场景中。可以使用goto语句到一个标签,通常称为“出口”或“清理”标签,是一种确保资源释放的常见方法。这种方式通常被称为“资源获取即初始化(Resource Acquisition Is Initialization,RAII)”的编程范式。
如果任何一个内存分配失败,goto exit;语句将会跳转到清理标签,执行资源释放的操作,确保内存管理的匹配性。这种方法可以减少重复的错误处理代码,提高代码的可读性和可维护性。但需要谨慎使用goto语句,以避免引入混乱和不易理解的代码结构。
#include <iostream>void complexFunction() {int* ptr1 = nullptr;int* ptr2 = nullptr;ptr1 = new int;if (ptr1 == nullptr) {std::cerr << "Memory allocation failed for ptr1" << std::endl;goto exit; // 内存分配失败,跳转到清理标签}ptr2 = new int;if (ptr2 == nullptr) {std::cerr << "Memory allocation failed for ptr2" << std::endl;delete ptr1; // 删除ptr1已分配的内存goto exit; // 内存分配失败,跳转到清理标签}// 使用ptr1和ptr2exit:delete ptr1; // 释放内存delete ptr2; // 释放内存
}int main() {complexFunction();return 0;
}
内存申请和释放原则为谁申请谁释放:内存的申请和释放应该由同一个模块或者同一个函数负责,以确保管理的一致性。
void process() {int* ptr = new int;// 使用ptrdelete ptr; // 释放内存的职责由process函数负责
}
注意内存越界:在操作数组和指针时,需要格外小心,确保不会发生数组越界或指针越界的情况,以避免潜在的安全问题。
int arr[5];
for (int i = 0; i < 5; ++i) {arr[i] = i;
}
// 错误的访问方式:arr[5] = 10; // 内存越界
良好的内存管理是高质量编程的基础之一。遵循以上内存管理规则可以有效地提高程序的健壮性和可靠性。
相关文章:
【C++】编程规范之内存规则
在高质量编程中,内存管理是一个至关重要的方面。主要有以下原则: 内存分配后需要检查是否成功:内存分配可能会失败,特别是在内存紧张的情况下。因此,在分配内存后,应该检查分配是否成功。 int* ptr new …...
并发编程之线程池的应用以及一些小细节的详细解析
线程池在实际中的使用 实际开发中,最常用主要还是利用ThreadPoolExecutor自定义线程池,可以给出一些关键的参数来自定义。 在下面的代码中可以看到,该线程池的最大并行线程数是5,线程等候区(阻塞队列)是3,即…...
基于JSP的农产品供销服务系统
背景 互联网的迅猛扩张彻底革新了全球各类组织的运营模式。自20世纪90年代起,中国的政府机关和各类企业便开始探索利用网络系统来处理管理事务。然而,早期的网络覆盖范围有限、用户接受度不高、互联网相关法律法规不完善以及技术开发不够成熟等因素&…...
redis之主从复制、哨兵模式
一 redis群集有三种模式 主从复制: 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。 主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。 缺陷: 故障恢复无法自动化&…...
【随笔】Git 基础篇 -- 分支与合并 git rebase(十)
💌 所属专栏:【Git】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…...
图像识别技术在体育领域的应用
图像识别技术在体育领域的应用是一个充满创新和挑战的研究方向。随着计算机视觉和人工智能技术的快速发展,图像识别技术已经在体育领域展现出广泛的应用潜力和实际价值。以下是一些图像识别技术在体育领域的具体应用: 运动员表现分析: 图像识…...
【项目新功能开发篇】开发编码
作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是࿰…...
软件设计原则:开闭原则
定义 开闭原则(Open-Closed Principle, OCP)是面向对象设计的基本原则之一,由 Bertrand Meyer 提出。它指出软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着软件应该设计成在不修改现有代…...
Python如何下载视频
大家好,今天我将为大家介绍如何使用Python来下载视频。Python作为一门强大的编程语言,不仅可以用于数据分析、机器学习等领域,还能用于网络爬虫和视频下载等任务。下面我将详细介绍如何使用Python来下载视频。 首先,我们需要明确…...
使用虚拟引擎为AR体验提供动力
Powering AR Experiences with Unreal Engine 目录 1. 虚拟引擎概述 2. 虚拟引擎如何为AR体验提供动力 3. 虚拟引擎中AR体验的组成部分是什么? 4. 使用虚拟引擎创建AR体验 5. 虚拟引擎中AR的优化提示 6. 将互动性融入AR与虚拟引擎 7. 在AR中…...
Kafka入门到实战-第五弹
Kafka入门到实战 Kafka常见操作官网地址Kafka概述Kafka的基础操作更新计划 Kafka常见操作 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://kafka.apache.org/Kafka概述 Apache Kafka 是一个开源的分布式事件流平台&…...
Ideal Holidays
题目链接 AtCoder Beginner Contest 347 C - Ideal Holidays 思路: 一周有 A B AB AB 天,前 A A A 天放假,问能不能把所有工作放进节假日里。 先看简单的,两个。其实我们并不是很在乎它们中间隔了多少天,我们只…...
Raven:一款功能强大的CICD安全分析工具
关于Raven Raven是一款功能强大的CI/CD安全分析工具,该工具旨在帮助广大研究人员对GitHub Actions CI工作流执行大规模安全扫描,并将发现的数据解析并存储到Neo4j数据库中。 Raven,全称为Risk Analysis and Vulnerability Enumeration for C…...
【苹果MAC】苹果电脑 LOGI罗技鼠标设置左右切换全屏页面快捷键
首先键盘设置->键盘快捷键 调度中心 设置 f1 f2 为移动一个空间(就可以快捷移动了) 想要鼠标直接控制,就需要下载官方驱动,来设置按键快捷键,触发 F1 F2 安装 LOGI OPTIONS Logi Options 是一款功能强大且便于使用…...
IDE/VS2015和VS2017帮助文档MSDN安装和使用
文章目录 概述VS2015MSDN离线安装离线MSDN的下载离线MSDN安装 MSDN使用方法从VS内F1启动直接启动帮助程序跳转到了Qt的帮助网页 VS2017在线安装MSDN有些函数在本地MSDN没有帮助?切换中英文在线帮助文档 概述 本文主要介绍了VS集成开发环境中,帮助文档MS…...
开启 Keep-Alive 可能会导致http 请求偶发失败
大家好,我是蓝胖子,说起提高http的传输效率,很多人会开启http的Keep-Alive选项,这会http请求能够复用tcp连接,节省了握手的开销。但开启Keep-Alive真的没有问题吗?我们来细细分析下。 最大空闲时间造成请求…...
【leetcode面试经典150题】4.删除有序数组中的重复项 II(C++)
【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...
【LeetCode热题100】【普通数组】合并区间
题目链接:56. 合并区间 - 力扣(LeetCode) 先排序,按左区排序,装第一个区间进入答案容器,判断答案容器钟最后一个区间的右区是否小于区间的左区,是则不能合并是新区间,否则可以合并 …...
自我认识的方法模型图
在漫长的人生旅途中,我们都在不断地探索、追寻,努力寻找那个最真实、最完整的自我。因为只有真正了解自己,才能战胜内心的种种困惑与恐惧,进而战胜外在的一切挑战与困难。自我认识,是每个人成长的必经之路,…...
dhcp和dhcp中继代理
简单说就是各个pc机的ip自动获取,不用手动设置 配置思路 1.使能dhcp功能 2.创建全局地址池 ip pool ,配置可用网络地址 network mask和网关地址刚刚忘记了,租约期 lease day hour 3.配置端口的网关地址(各个网络地址的第二位…...
GIL已死,GIL万岁?——2024大厂Python并发岗面试题库首发(含性能压测对比数据)
第一章:GIL已死,GIL万岁?——2024大厂Python并发岗面试题库首发(含性能压测对比数据)一道高频真题:为什么 asyncio.run() 启动的协程无法被 multiprocessing.Process 并发执行? 该问题直指 Pyth…...
数据恢复全面指南:开源数据救援工具组合实战手册
数据恢复全面指南:开源数据救援工具组合实战手册 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 数据丢失的噩梦与解决方案 2023年,摄影师小李在一次外景拍摄后误格式化了SD卡&#…...
泛微E9流程表单转PDF/HTML实战:手把手教你集成档案系统(附完整代码)
泛微E9流程表单转PDF/HTML全流程开发指南:从原理到实战 在企业管理数字化转型的浪潮中,OA系统与档案系统的无缝对接已成为提升组织效能的刚需。作为国内主流的协同办公平台,泛微E9的流程表单承载着企业核心业务流程数据,如何将这些…...
UE5 Widget Blueprint实战:5分钟搞定动态血量条与得分系统(附完整蓝图代码)
UE5 Widget Blueprint实战:5分钟搞定动态血量条与得分系统(附完整蓝图代码) 在独立游戏开发中,UI系统往往是决定玩家体验的关键因素之一。想象一下:当玩家在激烈的战斗中无法快速获取角色状态,或是完成成就…...
s2-pro语音合成教程:参考音频采样率/格式/信噪比最佳实践
s2-pro语音合成教程:参考音频采样率/格式/信噪比最佳实践 1. 认识s2-pro语音合成工具 s2-pro是Fish Audio开源的专业级语音合成模型镜像,它不仅能将文本转换为自然流畅的语音,还能通过参考音频来复用特定的音色。这意味着你可以上传一段样本…...
告别复杂配置:SDXL 1.0电影级绘图工坊开箱即用体验
告别复杂配置:SDXL 1.0电影级绘图工坊开箱即用体验 1. 为什么选择SDXL 1.0电影级绘图工坊 在AI绘图领域,Stable Diffusion XL(SDXL)1.0代表了当前最先进的文本到图像生成技术。然而,对于大多数非技术背景的创作者来说…...
科研党福音!爱毕业aibye力荐6大AI论文平台,智能改写+降重功能全解析。
工具名称 核心功能 特色优势 Aibiye 论文生成降AI率 全学科覆盖、仿写优化、自动图表生成 Aicheck AI检测文献综述辅助 精准查新、3分钟高效成文 GPT学术版 润色/翻译/代码解释 多模型协同、PDF深度解析 摆平论文 大纲生成降重改写 三步出稿、本硕博通用 QuillB…...
银河麒麟服务器系统4.02-sp2实战:飞腾架构下的虚拟机优化与远程管理
1. 银河麒麟服务器系统与飞腾架构概述 银河麒麟服务器系统4.02-sp2是国内自主研发的企业级操作系统,特别针对飞腾处理器架构进行了深度优化。飞腾作为国产CPU的代表之一,采用ARMv8指令集,在政务、金融等关键领域广泛应用。这套组合最大的特点…...
企业级vGPU选型指南:从GRID vApps到vCS,4种NVIDIA虚拟GPU场景化对比
企业级虚拟GPU技术选型全景指南:四大应用场景深度解析 在数字化转型浪潮中,图形处理单元(GPU)的虚拟化技术正成为企业IT架构的关键支柱。无论是设计团队的3D建模、数据分析师的机器学习任务,还是全公司范围的虚拟桌面部署,虚拟GPU…...
别再只仿真了!手把手教你用LabVIEW+USRP-2920搭建真实无线通信链路(BPSK/QPSK调制实战)
从仿真到实战:LabVIEW与USRP-2920构建无线通信链路的完整指南 在通信工程领域,仿真与硬件实现之间往往存在一道难以逾越的鸿沟。许多工程师能够熟练使用MATLAB或LabVIEW进行通信系统仿真,但当面对USRP-2920这样的射频硬件时,却常常…...
