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

文章目录

条款 16:成对使用 newdelete 时要采取相同形式


核心思想

  • 一致性要求

    当使用 new 分配内存时,必须在相应的 delete 操作中保持一致:

    • 如果使用 new,就用 delete
    • 如果使用 new[],就用 delete[]
  • 问题所在

    如果形式不匹配,会导致:

    • 未定义行为(例如访问已释放的内存或未正确释放内存)。
    • 可能引发资源泄漏。

示例代码

cpp 复制代码
// 正确用法
std::string* stringPtr1 = new std::string;        // 单个对象
std::string* stringPtr2 = new std::string[100];  // 数组

delete stringPtr1;      // 用 delete 释放单个对象
delete[] stringPtr2;    // 用 delete[] 释放数组

错误用法分析

cpp 复制代码
std::string* stringPtr = new std::string[100];
delete stringPtr;  // 错误:应该使用 delete[]
  • 后果
    • delete 只会调用数组第一个元素的析构函数,而不会正确释放整个数组的内存。
    • 导致资源泄漏或其他不可预期的行为。

设计建议

  1. 明确匹配规则

    • 使用 new 创建的对象用 delete 释放。
    • 使用 new[] 创建的数组用 delete[] 释放。
  2. 优先使用智能指针

    为避免手动管理动态内存,建议使用标准库提供的智能指针(如 std::unique_ptrstd::shared_ptr),它们能自动匹配合适的删除形式。

    智能指针示例

    cpp 复制代码
    #include <memory>
    
    std::unique_ptr<std::string> stringPtr1(new std::string);       // 单个对象
    std::unique_ptr<std::string[]> stringPtr2(new std::string[100]); // 数组
  3. 养成良好习惯

    • 避免混用 newdelete[]new[]delete
    • 检查代码以确保成对操作一致性。

总结

  • 使用 newdelete 的时候,要严格按照成对规则操作。
  • 推荐使用智能指针来自动管理动态内存,减少手动内存管理的错误风险。
相关推荐
山登绝顶我为峰 3(^v^)33 分钟前
C/C++ 交叉编译方法
java·c语言·c++
wuqingshun3141591 小时前
重写equals而不重写hashCode,会出什么问题?
java·开发语言
飞猪~1 小时前
LangChain python 版本 第一集
开发语言·python·langchain
李燚3 小时前
Go 项目怎么组织:DDD 4 层 vs MVC vs 脚本式
开发语言·golang·mvc·ddd·agent框架·eino
2zcode3 小时前
免费开源项目文档:基于MATLAB图像处理的啤酒瓶口缺陷检测系统设计与实现
开发语言·图像处理·matlab
人工智能时代 准备好了吗4 小时前
AI回答内容进入率监测:引用识别、文本匹配与语义判断
开发语言·人工智能·python
LONGZETECH4 小时前
新能源汽车动力电池检测仿真教学系统:C/S 分层架构与数字化实训落地全解析
大数据·c语言·开发语言·人工智能·架构·系统架构·汽车
郝学胜-神的一滴4 小时前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
Metaphor6924 小时前
使用 Python 冻结 Excel 文件中的行、列和单元格
开发语言·python·excel
言乐65 小时前
Python实现建造微服务商城后台
开发语言·python·算法·微服务·架构