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

深入解读ATPG Pattern类型:除了Basic Scan,Clock PO和RAM Sequential模式怎么用? 本文深入解析ATPG高级Pattern类型,包括Clock PO和RAM Sequential模式的应用策略。通过Mentor DFT工具链中的Tessent平台,详细介绍了这些模式的工作原理、配置命令及实战案例,帮助提升芯片测试的故障覆盖率和效率。特别适用于处理时钟域交叉和嵌入式存储器的复杂电路测试需求。 阅读详情

C++中,new和delete时用于动态内存管理的操作符.他们的底层实现和编译器处理涉及到内存分配、对象构造和析构等.

1、new和delete底层实现原理

1.1、new的底层实现

  • 内存分配: new操作符会调用operator new函数来分配内存.operator new是C++标准库提供的全局函数,通常底层会调用malloc或其他内存分配器.
  • 对象构造: 在分配内存后,new会调用对象的构造函数来初始化对象.
  • 编译器处理: 编译器会生成代码,确保在分配内存后调用构造函数.

1.2、delete的底层实现

  • 对象析构: delete操作符会先调用对象的析构函数来销毁对象.
  • 内存释放: 在析构完成后,delete会调用operator delete函数来释放内存. Operator delete通常底层会调用free函数
  • 编译器处理: 编译器会生成代码,确保在调用了析构函数后释放内存.

2、new和delete操作符的使用

2.1、单个对象

  • 使用new创建单个对象,使用delete释放单个对象
int* p = new int(10);  // 分配一个int对象,并初始化为10
delete p; // 释放单个对象

2.2、数组

  • 使用new[] 创建数组,使用delete[] 释放数组
int* arr = new int[10];  // 创建一个包含10各int元素的数组
delete[] arr;  // 释放数组

3、错误使用

3.1、使用delete释放数组

  • 如果使用delete释放数组,只会调用第一个元素的析构函数,其余元素不会被正确析构,导致内存泄漏或未定义行为
int* arr = new int[10];
delete arr;  // 错误:应该使用 delete[]

3.2、使用delete[] 释放单个对象

  • 如果使用delete[]释放单个对象,会导致未定义行为,因为delete[] 会尝试释放多个对象的内存
int* p = new int(10);
delete[] p;  // 错误:应该使用 delete

4、示例代码

  • 正确使用new和delete是避免内存泄漏和未定义行为的关键.
  • 实际开发中,建议优先使用智能指针来管理动态内存,减少手动管理内存的风险.
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "Constructor called!" << std::endl; }
    ~MyClass() { std::cout << "Destructor called!" << std::endl; }
};

int main() {
    // 正确使用:单个对象
    MyClass* obj = new MyClass();
    delete obj;  // 正确

    // 正确使用:数组
    MyClass* arr = new MyClass[3];
    delete[] arr;  // 正确

    // 错误使用:delete 释放数组
    MyClass* arr2 = new MyClass[3];
    // delete arr2;  // 错误:会导致内存泄漏和未定义行为

    // 错误使用:delete[] 释放单个对象
    MyClass* obj2 = new MyClass();
    // delete[] obj2;  // 错误:会导致未定义行为

    return 0;
}

思维导图笔记:

请添加图片描述

霍尼韦尔SoftMaster使用说明 立即下载

相关推荐

手把手教你逆向分析某里系bx-ua参数(以225版本为例)

本文详细解析了某里系应用bx-ua参数的逆向工程实战方法,重点拆解其三层加密体系(二进制加密、字符替换和Base64编码)。通过工具链配置和实战案例,帮助开发者掌握逆向分析技巧,适用于合法合规的安全研究和加密技术评估场景。

weixin_33220360的博客 412

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

深入解析 C++ 中 new 与 delete 的配对规则,揭示不匹配使用导致的未定义行为与内存泄漏风险,提供完整代码示例与最佳实践

凡人叶枫的博客 256

RocketMQ5.3.0-control-多 Master 多 Salve-异步复制-集群搭建

RocketMQ5.3.0-control-多 Master 多 Salve-异步复制-集群搭建(详细文档)

m0_52369979的博客 730

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

(参考自 http://www.cnblogs.com/hazir/p/new_and_delete.html) 1. new和delete不是函数,是C++的关键字. 2. new一个对象的实际操作分为两步:1). 调用标准库函数operator new分配内存 2)调用构造函数初始化(如果new的是内置类型则略过此步) delete一个对象的实际操作也分为两步:1)....

ddzai7557的博客 150

Keil调试技巧:3种方法查看Cortex-M4的SCB寄存器(含CPUID内存映射解析)

本文详细介绍了在Keil MDK中查看Cortex-M4内核SCB寄存器的三种实战方法:使用Watch窗口进行符号化观察、通过Memory窗口直接查看物理内存映射,以及利用SFR寄存器浏览器解析位域信息。文章重点解析了CPUID寄存器的内存映射地址(0xE000ED00)及其位域含义,帮助开发者深入理解处理器身份识别与底层调试技巧,提升嵌入式系统调试效率。

h6i7j8的博客 569

【视频编码学习】AVS3参考软件HPM-4.1简单配置运行

1、用Visual Studio2017打开HPM-4.1文件夹 2、找到文件夹目录下x86_windows文件夹,因为是在win上运行该代码 3、然后找到对应vs版本(我当时2017版)的解决方案sln文件,双击打开可以看到该解决方案下的全部项目。 4、重新生成解决方案时发现提示sdk版本问题,所以右键点击所有的项目,选择重定向项目,修改一下sdk版本。 ...

谦虚勤奋诚实感恩 3100

Effective C++ 学习笔记 条款16 成对使用new和delete时要采取相同形式

当你使用delete,也有两件事发生:针对此内存会有一个(或更多)析构函数被调用,然后内存才被释放(通过名为operator delete的函数,见条款51)。单一对象的内存则没有这笔记录。假设内存布局如上,delete灰度区若干内存并将它解释为“数组大小”,然后开始多次调用析构函数,浑然不知它所处理的那块内存不但不是个数组,并且或许那块内存中并未存有它正忙着销毁的那种类型的对象。至少,stringArray所含的100个string对象中的99个不太可能被适当删除,因为它们的析构函数很可能没被调用。

tus00000的博客 676

我用 AI Agent 全自动跑 COMSOL 仿真:从建模到后处理,踩了 10+ 个深坑

本文探讨了利用AI通过COMSOL Java API实现AI芯片液冷冷板全流程自动化仿真的实践。针对700W高功耗AI芯片的散热需求,构建了包含4颗Chiplet和微通道冷板的三维液冷模型。通过严格设计的Prompt工程,AI Agent成功完成了从几何建模到结果验证的全过程,最终实现了芯片最高温度54°C的良好散热效果。文章重点分享了10个关键问题的解决经验,包括流体连通性验证、网格顺序控制、离散阶数选择、收敛判据优化等,并建立了包含流场/热场/网格独立性的三重验证体系。实践表明,AI可高效处理重复性工作

sjjsjjsjjsjjsjj的博客 970

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

Scott Meyers说:成对使用new和delete时要采取相同形式。 意思很简单, 但我们程序员应该非常小心, 尤其是在处理堆内存问题的时候。 new和delete使用不恰当, 会产生未定义的不明确行为。 比如, 如下方式就是很好的方式: #include using namespace std; int main() { int *p = new int; delete p; /

认知 行动 坚持 7217

STM32F103四位数码管动态显示实战:从硬件连接到代码调试(附Proteus仿真)

本文详细介绍了STM32F103驱动四位数码管的动态显示技术,从硬件连接到代码调试的全过程。内容包括共阴/共阳数码管的区别、GPIO配置、动态显示原理及优化方法,并附有Proteus仿真验证。通过实战案例,帮助开发者快速掌握STM32数码管动态显示的核心技术。

weixin_29168393的博客 470

【Unity】【2D】用连续图片生成动画Animation的简明步骤

本文介绍了Unity中使用2D连续图片制作2D动画Animation的简明步骤。

O青草O的博客 Unity和游戏制作知识分享 718

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

一、概念 如果申请(new)的对象为单一对象,那么在释放(delete)的时候就只要简单的释放即可 如果申请(new [])的对象为对象数组,那么在释放(delete [])的时候就要以[]释放之 二、演示案例 申请单一对象: std::string* stringArray = new std::string; delete stringArray; //正确的 //delete[] stringArray;错误的 申请对象数组: std...

www_dong的博客 215

Parasoft C++Test软件单元测试_操作指南

本文主要为使用C++TEST进行单元测试的流程性操作讲解,后续文章将以专题形式进行详细讲解,以及用一些被测函数作为示例进行实例讲解。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1574

读书笔记《Effective C++》条款16:成对使用new和delete时要采取相同形式

以下程序会有什么错? std::string* stringArray = new std::string[100]; ... delete stringArray; 看上去都井然有序,使用了new,也搭配使用了对应的delete,但还是有个某个完全错误:程序行为不明确。最低限度,stringArray所含的100个string对象中的99个不太可能被适当删除,因为它们的析构函数很可能没有被调

Do-Program的专栏 285

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Effective C++条款16——成对使用new和delete时要采取相同形式(资源管理)

更明确地说,数组所用的内存通常还包括“数组大小”的记录,以便delete知道需要调用多少次析构函数。假设内存布局如上,delete会读取若干内存并将它解释为“数组大小”,然后开始多次调用析构函数,浑然不知它所处理的那块内存不但不是个数组,也或许并未持有它正忙着销毁的那种类型的对象。使用了new,也搭配了对应的 delete。这个规则对于喜欢使用typedef的人也很重要,因为它意味typedef的作者必须说清楚,当程序员以new创建该种typedef类型对象时,该以哪一种delete形式删除之。

StudyWinter的博客 315

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

《Effective C++》学习笔记条款16 成对使用new和delete时要采取相同形式

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

UE引擎开发工程师 1234

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Effective C++条款16:资源管理之(成对使用new和delete时要采取相同形式)

一、概念 如果申请(new)的对象为单一对象,那么在释放(delete)的时候就只要简单的释放即可 如果申请(new [])的对象为对象数组,那么在释放(delete [])的时候就要以[]释放之 二、演示案例 申请单一对象 std::string* stringArray = new std::string; delete stringArray; //正确的 //delet...

董哥的黑板报 753

Effective C++条款16:成对使用new和delete时要采取相同形式(Use the same form in corresponding uses of new and delete)

Effective C++条款16:成对使用new和delete时要采取相同形式(Use the same form in corresponding uses of new and delete)

CltCj的博客 380

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

当你使用new(也就是通过new动态生成一个对象),有两件事发生:第一,内存被分配出来;第二,针对此内存会有一个(或更多)构造函数被调用。 当你使用delete,也有两件事发生:针对此内存会有一个(或更多〉析构函数被调用,然后内存才被释放。 delete的最大问题在于:即将被删除的内存之内究竟存有多少对象。这个问题的答案决定了有多少个析构函数必须被调用起来。 实际上这个问题可以更简单些:即将被删除的那个指针,所指的是单一对象或对象数组?这是个必不可缺的问题,因为单一对象的内存布局一般而言不同于数组的内存布局

qq_36698189的博客 189

Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式

User the same from in corresponding uses of new and deletes 条款16:User the same from in corresponding uses of new and deletes(成对使用new和dele

wintree的专栏 1197

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

这个条款比较好理解,就是new有两种形式: 1 int *p = new int(); // 申请一个int资源 2 int *p = new int[3]; // 申请连续三块int资源 而delete也有两种资源: 1 delete p; // delete指针所指向的单一资源 2 delete [] p; // delete指针所指向的多个连续资源块 那么该各

liuxiaomao1988的专栏 490

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

(一) 先看下面的代码: string* stringArray = new std::string[100]; ... delete stringArray; 这样的做法是错误的,因为stringArray所含的100个string对象中的99个可能并没有被适当地删除,因为它们的析构函数很可能没有被调用。   (二) 使用new时发生的事情: (1)内存被分配出来; (2)针

u010470972的专栏 771

《Effective C++》学习笔记(条款16:成对使用new和delete时采取相同形式)

最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! C++中要求通过关键字 new 出来的对象,不使用的时候要通过关键字 delete 将对象的资源释放,不然会导致内存泄漏。 当你使用 new ,有两件事发生,一是内存被分配出来,二是针对此内存会有一个(或更多)构造函数被调用。当你使用 delete ,也有两件事发生,一是针对此内存会有一个(或更多)析构函数被调用,然后内存才被释放。delete 的最大问题在于:即将被删除的内存究竟村有

ZLX的博客 253

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

Core List 1.  new 和 delete 的实现过程      new :

458

effective C++学习---条款16:成对使用new和delete时要采取相同形式

/* 用new时有两件事情发生: 内存被分配出来 针对内存会有一个构造函数被调用(对相关内存管理的类进行初始化) 用delete时同样也是有两件事发生: 针对内存有一个析构函数被调用(对相关内存管理的对象进行释放) 内存被回收 delete最关心的就是,即将被删除的内存内究竟有多少个对象,这决定需要调用多少个析构函数; 即将被删除的那个指针指向的是单一对象还是对象数组 */ de...

chenbiyun940419的博客 212

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

如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。 转载于:https://www.cnblogs.com/wen-ge/p/4266101.html...

weixin_30301183的博客 93
上一篇: [Effective C++]条款15:在资源管理类中提供对原始资源的访问
下一篇: [Effective C++]条款17:以独立语句将newed对象置入智能指针
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值