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

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

文章目录

    • 条款 16:成对使用 `new` 和 `delete` 时要采取相同形式
      • 核心思想
      • 示例代码
      • 错误用法分析
      • 设计建议
      • 总结

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


核心思想

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

    • 如果使用 new,就用 delete
    • 如果使用 new[],就用 delete[]
  • 问题所在
    如果形式不匹配,会导致:

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

示例代码

// 正确用法
std::string* stringPtr1 = new std::string;        // 单个对象
std::string* stringPtr2 = new std::string[100];  // 数组delete stringPtr1;      // 用 delete 释放单个对象
delete[] stringPtr2;    // 用 delete[] 释放数组

错误用法分析

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

设计建议

  1. 明确匹配规则

    • 使用 new 创建的对象用 delete 释放。
    • 使用 new[] 创建的数组用 delete[] 释放。
  2. 优先使用智能指针
    为避免手动管理动态内存,建议使用标准库提供的智能指针(如 std::unique_ptrstd::shared_ptr),它们能自动匹配合适的删除形式。

    智能指针示例

    #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 的时候,要严格按照成对规则操作。
  • 推荐使用智能指针来自动管理动态内存,减少手动内存管理的错误风险。
http://www.lryc.cn/news/510478.html

相关文章:

  • 【HarmonyOS NEXT】鸿蒙原生应用“上述”
  • 【人工智能】使用Python构建推荐系统:从协同过滤到深度学习
  • 店铺营业状态设置
  • batchnorm和layernorm的理解
  • 在git commit之前让其自动执行一次git pull命令
  • 【Rust自学】6.3. 控制流运算符-match
  • 大模型应用技术系列(三): 深入理解大模型应用中的Cache:GPTCache
  • 『大模型笔记』评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释
  • 深度解析:Maven 和 Gradle 的使用比较及常见仓库推荐
  • SQLite本地数据库的简介和适用场景——集成SpringBoot的图文说明
  • 管理面板Ajenti的在Windows10下Ubuntu24.04/Ubuntu22.04里的安装
  • 在Python如何用Type创建类
  • Android学习19 -- NDK4--共享内存(TODO)
  • 《Cocos Creator游戏实战》非固定摇杆实现原理
  • RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)
  • 【VScode】第三方GPT编程工具-CodeMoss安装教程
  • 在JavaScript中,let 和 const有什么不同
  • Mysq学习-Mysql查询(4)
  • 安装torch-geometric库
  • Java数组深入解析:定义、操作、常见问题与高频练习
  • Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde
  • 【C语言练习(17)—输出杨辉三角形】
  • SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换
  • React 第二十节 useRef 用途使用技巧注意事项详解
  • VIVO Java开发面试题及参考答案
  • C# Winfrom chart图 实例练习
  • iOS从Matter的设备认证证书中获取VID和PID
  • 带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)
  • 破解海外业务困局:新加坡服务器托管与跨境组网策略
  • Mybatis-Plus快速入门