C++核心指导原则: 资源管理

C++ Core Guidelines 整理目录

  1. 哲学部分
  2. 接口(Interface)部分
  3. 函数部分
  4. 类和类层次结构部分
  5. 枚举部分
  6. 资源管理部分

资源管理规则

R.1: Manage resources automatically using resource handles and RAII (Resource Acquisition Is Initialization)

  • 翻译: 使用资源句柄和 RAII 自动管理资源.
  • 原因: 确保资源在对象生命周期内得到妥善管理和释放, 避免内存泄漏和其他资源管理问题.

R.2: In interfaces, use raw pointers to denote individual objects (only)

  • 翻译: 在接口中使用原始指针仅表示单个对象.
  • 原因: 明确指出函数或方法参数仅为指向对象的引用, 并不涉及所有权转移, 防止不必要的复杂性和错误.

R.3: A raw pointer (a T*) is non-owning

  • 翻译: 原始指针(T*)是非拥有的.
  • 原因: 强调原始指针不负责所指向对象的生命周期管理, 有助于清晰地界定责任, 减少内存管理错误.

R.4: A raw reference (a T&) is non-owning

  • 翻译: 原始引用(T&)是非拥有的.
  • 原因: 类似于原始指针, 原始引用也不拥有其所引用的对象, 帮助明确代码中各部分的责任界限.

R.5: Prefer scoped objects, don’t heap-allocate unnecessarily

  • 翻译: 优先使用作用域内的对象, 避免不必要的堆分配.
  • 原因: 减少手动管理内存的需求, 提高程序的安全性和性能, 简化内存管理逻辑.

R.6: Avoid non-const global variables

  • 翻译: 避免非 const 全局变量.
  • 原因: 全局变量可能会导致难以维护的状态变化, 影响程序的稳定性和可预测性, 使用常量或局部变量替代可以提高代码质量.

分配和释放规则

R.10: Avoid malloc() and free()

  • 翻译: 避免使用malloc()free().
  • 原因: C++提供了更安全和高效的内存管理机制, 如newdelete, 以及智能指针. 使用malloc()free()可能导致类型不匹配和资源泄漏问题.

R.11: Avoid calling new and delete explicitly

  • 翻译: 尽量不要显式调用newdelete.
  • 原因: 显式的内存分配和释放容易出错, 且不易于管理. 推荐使用智能指针(如unique_ptrshared_ptr)自动管理对象生命周期, 减少手动管理内存的需求.

R.12: Immediately give the result of an explicit resource allocation to a manager object

  • 翻译: 显式资源分配的结果应立即交给一个管理对象.
  • 原因: 确保资源在分配后立刻由一个负责的对象进行管理, 避免资源泄露, 并简化资源管理逻辑.

R.13: Perform at most one explicit resource allocation in a single expression statement

  • 翻译: 单个表达式语句中最多进行一次显式资源分配.
  • 原因: 限制单个表达式中的显式资源分配次数有助于保持代码的清晰性和可维护性, 降低复杂度并减少错误的发生几率.

R.14: Avoid [] parameters, prefer span

  • 翻译: 避免使用[]参数, 更倾向于使用 span.
  • 原因: 使用std::span代替传统的数组参数传递方式, 可以提供更安全, 更灵活的数据访问方法, 同时保留原始数组的连续性和效率优势.

R.15: Always overload matched allocation/deallocation pairs

  • 翻译: 总是重载匹配的分配/释放对.
  • 原因: 当自定义类需要进行内存管理时, 确保为每一种类型的分配操作都有相应的释放操作, 这样可以保证内存管理的一致性和安全性, 避免内存泄漏或其他资源管理问题.

智能指针规则

R.20: Use unique_ptr or shared_ptr to represent ownership

  • 翻译: 使用unique_ptrshared_ptr来表示所有权.
  • 原因: 明确对象的所有权关系, 避免手动管理内存带来的复杂性和潜在错误. unique_ptr用于独占所有权, 而shared_ptr用于共享所有权.

R.21: Prefer unique_ptr over shared_ptr unless you need to share ownership

  • 翻译: 除非需要共享所有权, 否则优先使用unique_ptr.
  • 原因: unique_ptr提供了更高效, 更简单的所有权管理方式, 只有在确实需要共享对象时才使用shared_ptr.

R.22: Use make_shared() to make shared_ptrs

  • 翻译: 使用make_shared()创建shared_ptr.
  • 原因: make_shared()不仅简化了代码, 还能通过减少分配次数提高性能, 并确保线程安全.

R.23: Use make_unique() to make unique_ptrs

  • 翻译: 使用make_unique()创建unique_ptr.
  • 原因: make_unique()提供了一种安全且简洁的方式来创建unique_ptr, 避免了显式调用new带来的风险.

R.24: Use std::weak_ptr to break cycles of shared_ptrs

  • 翻译: 使用std::weak_ptr打破shared_ptr循环引用.
  • 原因: 防止由于循环引用导致的对象无法释放, 从而引起内存泄漏问题. weak_ptr可以观察但不增加引用计数.

R.30: Take smart pointers as parameters only to explicitly express lifetime semantics

  • 翻译: 只有为了明确表达生命周期语义时, 才将智能指针作为参数传递.
  • 原因: 确保函数或方法的参数清晰地表明对象的生命周期管理意图, 避免不必要的复杂性.

R.31: If you have non-std smart pointers, follow the basic pattern from std

  • 翻译: 如果你使用非标准库的智能指针, 请遵循标准库的基本模式.
  • 原因: 确保自定义智能指针的行为与标准库保持一致, 便于理解和维护.

R.32: Take a unique_ptr<widget> parameter to express that a function assumes ownership of a widget

  • 翻译: 使用unique_ptr<widget>参数表示函数接管一个widget的所有权.
  • 原因: 清晰地表明函数接收并接管对象的所有权, 避免所有权不明确的问题.

R.33: Take a unique_ptr<widget>& parameter to express that a function reseats the widget

  • 翻译: 使用unique_ptr<widget>&参数表示函数重新设置widget的所有权.
  • 原因: 允许函数修改传入的unique_ptr, 以便在函数内部改变其指向的对象.

R.34: Take a shared_ptr<widget> parameter to express shared ownership

  • 翻译: 使用shared_ptr<widget>参数表示共享所有权.
  • 原因: 表明多个对象或函数共同拥有该资源, 确保资源的生命周期由所有者共同管理.

R.35: Take a shared_ptr<widget>& parameter to express that a function might reseat the shared pointer

  • 翻译: 使用shared_ptr<widget>&参数表示函数可能会重新设置共享指针.
  • 原因: 允许函数修改传入的shared_ptr, 以便在函数内部改变其指向的对象或调整引用计数.

R.36: Take a const shared_ptr<widget>& parameter to express that it might retain a reference count to the object ???

  • 翻译: 使用const shared_ptr<widget>&参数表示可能保留对对象的引用计数.
  • 原因: 在不需要修改共享指针的情况下, 尽量使用常量引用以减少不必要的拷贝操作, 同时维持引用计数.

R.37: Do not pass a pointer or reference obtained from an aliased smart pointer

  • 翻译: 不要传递从别名智能指针获得的指针或引用.
  • 原因: 避免因别名智能指针引起的混淆和潜在的生命周期管理问题, 确保每个对象的所有权关系清晰明确.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】【网络】不同子网下的客户端和服务器通信

【Linux】【网络】不同子网下的客户端和服务器通信 前两天在进行socket()网络编程并进行测试时&#xff0c;发现在不同wifi下两个电脑无法进行连接&#xff0c;大概去查找了如何解决 看到可以使用 frp 这个快速反向代理实现。 frp 可让您将位于 NAT 或防火墙后面的本地服务器…

基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统

2024旅游推荐系统爬虫可视化&#xff08;协同过滤算法&#xff09; 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…

基于 go-wrk 在 Windows 环境下对 Go Web 应用进行 HTTP 压力测试

基于 go-wrk 在 Windows 环境下对 Go Web 应用进行 HTTP 压力测试 这部分内容参考并搬运自 q1mi 老师的技术博客&#xff0c;原文的链接为&#xff1a;https://liwenzhou.com/posts/Go/benchmark-tools/。 压测相关术语 响应时间&#xff08;RT&#xff09;&#xff1a;指系…

CSS 媒体查询:从入门到精通,打造跨设备完美体验

在当今移动互联网时代&#xff0c;用户访问网站的设备早已不再局限于桌面电脑&#xff0c;手机、平板等各种屏幕尺寸的设备层出不穷。为了确保用户在不同设备上都能获得良好的浏览体验&#xff0c;响应式网页设计应运而生。而 CSS 媒体查询&#xff0c;正是实现响应式设计的核心…

如何在 macOS 上配置 MySQL 环境变量

如何在 macOS 上配置 MySQL 环境变量 步骤 1: 查找 MySQL 安装路径 打开终端&#xff0c;使用以下命令查找 mysql 的可执行文件路径&#xff1a; which mysql如果该命令没有返回结果&#xff0c;可以使用 find 命令&#xff1a; sudo find / -name "mysql" 2>/de…

Gin从入门到精通 (五)数据绑定与验证

数据绑定与验证 数据绑定是指将请求数据&#xff08;如 JSON、表单、URL 参数等&#xff09;绑定到 Go 语言中的结构体。Gin 提供了便捷的方法将请求中的数据映射到预定义的结构体字段上&#xff0c;使得开发者可以像访问结构体字段一样访问请求数据。 数据验证是对绑定到结构…

计算机毕业设计SpringBoot+Vue.jst网上超市系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【论文解读】《Training Large Language Models to Reason in a Continuous Latent Space》

论文链接 1. 背景与动机 语言空间与推理的矛盾 目前大多数大语言模型&#xff08;LLMs&#xff09;在解决复杂问题时采用链式思维&#xff08;Chain-of-Thought, CoT&#xff09;方法&#xff0c;即利用自然语言逐步推导出答案。然而&#xff0c;论文指出&#xff1a; 自然语言…

DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

DevEco Studio快捷键 DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境&#xff0c;它提供了丰富的快捷键以提高开发效率&#xff0c;以下为你详细介绍不同操作场景下的常用快捷键&#xff1a; 通用操作快捷键 操作描述Windows/Linux 快捷键Mac 快捷键打开设置窗…

4. MySQL 逻辑架构说明

4. MySQL 逻辑架构说明 文章目录 4. MySQL 逻辑架构说明1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors(连接器)1.3 第1层&#xff1a;连接层1.4 第2层&#xff1a;服务层1.5 第3层&#xff1a;引擎层1.6 存储层 2. SQL执行流程2.1 MySQL 中的 SQL 执行流程 2.2 MySQL…

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示

代码链接 摘要 摘要写作总结&#xff1a; 1.提出 两个关键点 &#xff08;视觉语言模型【模型】 少量工业异常检测【方向】&#xff09; 2.想要解决的问题 3.针对上述问题&#xff0c;本文提出了一种什么【方法】的什么【应用方面】方法【模型名】 4.具体讲方法的步骤 5.实验…

WPF框架学习

WPF 可以想winfrom 那样在cs文件修改 属性数据&#xff1b; 为了前后端分离 而解耦合&#xff0c;有了M-V-VM模式 常见框架有 MVVMlight / Prism 等 ------------------------------------------------------------------------------------- 一、前提&#xff1a;有一定基…

网络运维学习笔记 017 HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置&#xff08;IP二层VLAN链路聚合&#xff09;ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…

git,bash - 从一个远端git库只下载一个文件的方法

文章目录 git,bash - 从一个远端git库只下载一个文件的方法概述笔记写一个bash脚本来自动下载get_github_raw_file_from_url.shreanme_file.shfind_key_value.sh执行命令 END git,bash - 从一个远端git库只下载一个文件的方法 概述 github上有很多大佬上传了电子书库&#xf…

【废物研究生零基础刷算法】DFS与递归(一)典型题型

文章目录 跳台阶递归实现指数级枚举递归实现排列型枚举上面两题总结 递归实现组合型枚举P1036选数 跳台阶 思路&#xff1a; 如果 n 1&#xff0c;只有一种走法&#xff08;走 1 级&#xff09;。如果 n 2&#xff0c;有两种走法&#xff08;11 或 2&#xff09;。对于 n &g…

Java-01-源码篇-04集合-05-ConcurrentHashMap(1)

1.1 加载因子 加载因子&#xff08;Load Factor&#xff09;是用来决定什么时候需要扩容的一个参数。具体来说&#xff0c;加载因子 当前元素数量 / 桶的数量&#xff0c;当某个桶的元素个数超过了 桶的数量 加载因子 时&#xff0c;就会触发扩容。 我们都知道 ConcurrentHas…

AI赋能的未来城市:如何用智能化提升生活质量?

这会是我们憧憬的未来城市吗&#xff1f; 随着技术的不断进步和城市化进程的加速&#xff0c;现代城市面临着诸多挑战——交通拥堵、环境污染、能源消耗、人口老龄化等问题愈发突出。为了应对这些挑战&#xff0c;建设智慧城市已成为全球发展的重要趋势。在这一进程中&#xf…

DeepSeek各模型现有版本对比分析

文章目录 一、基础模型系列&#xff1a;V1 到 V3 的演进二、专用模型系列&#xff1a;推理与多模态三、版本选型与商业化趋势 DeepSeek作为最近特别火爆的模型&#xff0c;本文将对DeepSeek现有的主要版本进行对比分析,涵盖参数规模、训练数据、功能改进、应用场景和性能表现等…

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示&#xff0c;在编辑器内显示成img标签&#xff0c;二次保存视频被替换问题 问题1&#xff1…