【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.配置端口的网关地址(各个网络地址的第二位…...
电池创新如何跨越量产鸿沟:从实验室到工厂的工程化实践
1. 从实验室到工厂:电池创新的“量产魔咒”最近几年,电池行业绝对是资本和媒体眼中的“香饽饽”。动辄数十亿、上百亿美元的投资砸向新的生产设施和前沿技术,目标直指电动汽车、智能电网乃至整个智慧城市的能源基石。新闻稿里,我们…...
半导体设备投资热潮:千亿美元流向、产业逻辑与工程师应对策略
1. 从百亿投资狂潮看半导体制造的底层逻辑最近和几个在晶圆厂和Fab设备商工作的老朋友聊天,话题总绕不开一个词:投资。无论是台积电、三星的先进制程军备竞赛,还是中芯国际、联电的成熟制程扩产,背后都是一台台价值数千万甚至上亿…...
告别手动计算!用C#给ArcGIS做个插件,一键搞定城市风环境评估(附源码思路)
从零构建ArcGIS风环境评估插件:C#实战与架构设计 在建筑规划与城市设计中,风环境评估往往需要反复计算迎风面指数这类专业指标。传统工作流中,规划师需要手动处理风向数据、编写脚本批处理建筑网格,不仅效率低下,还容易…...
GDScript Mod Loader:为Godot游戏打造专业模组生态的完整指南
1. 项目概述:为你的Godot游戏注入社区活力如果你是一名使用Godot引擎的独立游戏开发者,或者是一位热衷于为喜爱的游戏创造新内容的玩家,那么“模组”这个概念你一定不陌生。模组,或者说Mod,是游戏社区生命力的重要源泉…...
VisualCppRedist AIO:告别DLL错误,Windows系统必备的一体化运行库解决方案
VisualCppRedist AIO:告别DLL错误,Windows系统必备的一体化运行库解决方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经在打…...
【波导仿真】基于矢量有限元法分析均匀波导附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#x…...
服务器运维与DevOps融合:迈向智能化运维的新纪元
在数字化浪潮席卷全球的今天,企业对IT基础设施的依赖程度日益加深,服务器运维作为支撑业务连续性和系统稳定性的核心环节,正面临前所未有的挑战与机遇。传统运维模式依赖人工干预、响应滞后、效率低下,已难以满足现代业务快速迭代…...
告别编译警告!MDK AC6编译器下STM32Cube FreeRTOS工程的__packed等语法适配指南
ARM Compiler v6下STM32Cube FreeRTOS工程的零警告优化实战 当你从ARM Compiler v5切换到v6时,可能会发现原本运行良好的STM32CubeMX生成的FreeRTOS工程突然冒出几十个编译警告。这些黄色的小三角虽然不会阻止程序编译,但对于追求代码质量的开发者来说&a…...
InjectFix实战:除了修Bug,如何在Unity里用它安全地‘新增’功能与属性?
InjectFix实战:突破Bug修复边界,安全扩展Unity功能 在Unity开发中,InjectFix作为热修复方案早已被开发者熟知,但大多数教程仅停留在修复Bug的基础用法上。当线上版本需要临时增加活动界面属性或工具函数时,重新打包发布…...
从Java后端到AI风口:转型踩坑一年,我悟了!涨薪30%的真相是…
做了八年Java后端,去年咬牙转型AI应用开发。这一年踩过坑、加过班、也被面试官问倒过。但回头看,这条路选对了——薪资涨了30%,职业空间也打开了。我必须告诉那些还在犹豫要不要从后端跳出来的同行——现在的AI应用开发社招,确实是…...
