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

Effective C++ 条款16: 成对使用new和delete时要采用相同形式

Effective C++ 条款16:成对使用new和delete时要采用相同形式


核心思想动态分配数组时使用new[]delete[],分配单个对象时使用newdelete,两者必须严格匹配,否则导致未定义行为(内存泄漏或程序崩溃)。

⚠️ 1. 混用形式的灾难性后果

错误配对示例

// 场景1:数组分配用delete释放
std::string* strArray = new std::string[10];
delete strArray;  // 错误!应为delete[] → 内存泄漏/程序崩溃// 场景2:单个对象用delete[]释放
std::string* singleStr = new std::string;
delete[] singleStr;  // 错误!应为delete → 程序崩溃

内存布局差异

分配方式内存布局释放所需操作
new[对象数据]调用1次析构函数
new[][数组长度][对象1][对象2]…调用n次析构函数+长度读取

🚨 2. 解决方案:严格配对使用

正确配对规则

// 单个对象
Type* singleObj = new Type;    // 分配
delete singleObj;              // 释放// 对象数组
Type* objArray = new Type[10]; // 分配
delete[] objArray;             // 释放

typedef陷阱与修复

// 危险:隐藏数组类型
typedef std::string AddressLines[4]; 
std::string* pal = new AddressLines; // 实际是new string[4]delete pal;     // 错误!未使用delete[] → 仅析构第一个元素
delete[] pal;   // 正确!严格匹配new[]

⚖️ 3. 关键原则与注意事项
原则说明违反后果
new/delete配对单个对象分配释放必须成对使用对象析构不全
new[]/delete[]配对数组分配释放必须成对使用内存泄漏或程序崩溃
避免typedef数组使用std::vectorstd::array替代数组typedef消除配对认知负担
智能指针优先使用std::vector/unique_ptr<T[]>管理数组自动匹配释放形式

现代C++最佳实践

// 替代原生数组(推荐)
std::vector<std::string> addressLines(4);  // 自动管理内存// 需要裸指针时使用智能指针数组版本
auto pal = std::make_unique<std::string[]>(4); // C++14+
pal[0] = "1600 Pennsylvania Ave";
// 自动调用delete[]释放

类型安全封装

template<typename T>
using ArrayPtr = std::unique_ptr<T[]>;  // 安全数组指针别名ArrayPtr<std::string> createAddress() {return std::make_unique<std::string[]>(4);
} // 自动正确释放

💡 关键原则总结

  1. 严格配对原则
    • newdelete
    • new Type[n]delete[]
    • 绝对禁止交叉使用
  2. typedef数组的危险性
    • 避免对数组类型使用typedef → 改用std::vectorstd::array
    • 必须typedef时显式标注delete[]
  3. 智能指针自动匹配
    • std::unique_ptr<T[]>自动使用delete[]
    • std::shared_ptr需自定义数组删除器

错误示例诊断:typedef导致的隐性错误

typedef int BufferType[1024];
int* buffer = new BufferType;  // 实际分配数组delete buffer;  // 错误!应为delete[] → 仅释放第一个元素

安全修复方案

// 方案1:显式使用delete[]
delete[] buffer;  // 正确配对// 方案2:改用标准容器(推荐)
std::array<int, 1024> buffer;  // 栈分配自动管理// 方案3:智能指针管理
auto buffer = std::make_unique<int[]>(1024);
http://www.lryc.cn/news/606782.html

相关文章:

  • pycharm快捷键设置为和vscode一样
  • 数据仓库、数据湖与湖仓一体技术笔记
  • 高防服务器租用:保障数据安全
  • 自建rustdesk服务器过程记录
  • 【代码】印章提取红色部分
  • 观测云基于 ToB/ToC 业务可观测最佳实践
  • Android ConstraintLayout 使用详解
  • A 常见图形API和图形渲染引擎介绍
  • k8s云原生rook-ceph pvc快照与恢复(上)
  • 提问总结1
  • 3. boost::asio之同步读写的客户端和服务器示例
  • Syzkaller实战教程5: 初始种子加载机制剖析第一集
  • “数据管理” 一场高风险的游戏
  • CSS Text(文本)详解
  • 【工具变量】上市公司企业突破性创新及渐进性创新数据集-含处理带代码(2012-2024年)
  • Shell脚本批量检测IP的443端口联通性
  • DB-GPT 0.7.3 版本更新:支持Qwen3 Embedding和Reranker模型、支持知识库自定义检索策略等
  • 从0开始学习R语言--Day64--决策树回归
  • 登录校验一
  • zabbix平台无法删除已停用主机的处理案例
  • 【华为机试】127. 单词接龙
  • Spring Boot + MongoDB:从零开始手动配置 MongoConfig 实战
  • SAM2 : Segment Anything in Images and Videos
  • 神经网络的基础
  • 【前端】CSS Flexbox布局示例介绍
  • CSS组件化样式新篇章:@scope
  • SystemVerilog的系统函数和任务
  • 无图形界面的CentOS 7网络如何配置
  • 【0基础PS】PS工具详解--仿制图章工具
  • OpenGL Camera