当前位置: 首页 > news >正文

Item16:成对使用new和delete时要采取相同形式

在C++中,newdelete是管理动态内存的核心操作符,但它们的使用存在严格的“配对规则”。《Effective C++》Item16“成对使用new和delete时要采取相同形式”(Use the same form in corresponding uses of new and delete)明确指出:new分配内存时,必须用对应的delete形式释放——单个对象用delete,数组用delete[]。违反这一规则会导致未定义行为,轻则内存泄露,重则程序崩溃。本文将深入解析这一条款,探讨配对规则的底层逻辑、不匹配的风险及实践中的注意事项。

一、new与delete的底层工作机制

要理解配对规则,需先明确newdelete的工作流程:

(一)单个对象的分配与释放(new + delete

  • new T的操作

    1. 调用operator new分配足够存储T类型对象的内存;
    2. 在分配的内存上调用T的构造函数,初始化对象。
  • delete p的操作

    1. 调用p指向对象的析构函数,清理资源;
    2. 调用operator delete释放内存。

(二)数组的分配与释放(new[] + delete[]

  • new T[n]的操作

    1. 调用operator new[]分配内存(除了存储nT对象,通常还会额外分配4/8字节存储数组大小n);
    2. 依次在内存上调用nT的构造函数,初始化每个元素。
  • delete[] p的操作

    1. 根据额外存储的数组大小n,依次调用nT的析构函数;
    2. 调用operator delete[]释放整个数组的内存。

核心差异:数组的“大小记录”

new[]会在内存块头部隐式存储数组元素数量(n),这是delete[]能够正确调用所有元素析构函数的关键。而new(单个对象)不会存储额外信息,delete也无需处理数组逻辑。

二、不匹配的风险:未定义行为的根源

newdelete形式不匹配(如用delete释放new[]分配的数组,或用delete[]释放new分配的单个对象),会导致底层机制混乱,引发未定义行为。

(一)用delete释放new[]分配的数组(最危险)

假设我们分配一个对象数组:

http://www.dtcms.com/a/301646.html

相关文章:

  • Sklearn 机器学习 数值指标 混淆矩阵confusion matrix
  • Java知识体系
  • 初识 docker [上]
  • 【高等数学】第六章 定积分的应用——第三节 定积分在物理学上的应用
  • GO语言 go get 下载 下来的包存放在哪里
  • 线程安全问题的发现与解决
  • 2025 DevOps开源工具全景指南:构建面向未来的智能交付体系
  • 嵌入式软件面试八股文
  • 面试150 数字范围按位与
  • PLLIP核
  • 测试老鸟整理,物流项目系统测试+测试点分析(一)
  • 【笔记】Gibbs自由能全微分公式推导
  • AJAX 原理_第一节_XHR 对象
  • 免安装MySQL启动全解:从解压到远程访问的保姆级教程
  • U盘中毒,文件被隐藏的解决方法
  • Redis6.0+安装教程(Linux)
  • Map系列
  • docker搭建部署 onlyoffice 实现前端集成在线解析文档解决方案
  • 车载诊断架构 ---面向售后的DTC应该怎么样填写?
  • net8.0一键创建支持(Kafka)
  • 基于Prometheus+Grafana的分布式爬虫监控体系:构建企业级可观测性平台
  • 【旧文】Adobe Express使用教程
  • net8.0一键创建辅助开发的个人小工具
  • c++加载qml文件
  • G1回收器
  • 企业IT管理——信息安全策略纲要【模板】
  • TIM 编码器接口
  • listen() 函数详解
  • 表单重复提交、以及重复消费的幂等性问题解决方案
  • 企业如何便捷地使用宝塔面板管理系统服务和网站:一键全能部署与高效运维