条款5:对应的new和delete要采用相同的形式

手把手教你配置SAP PP供应区域(Supply Area):实现线边仓精准发料与物料流优化 本文详细解析了SAP PP供应区域(Supply Area)的配置方法,帮助企业实现线边仓精准发料与物料流优化。通过三级优先级逻辑和四步配置法,系统可自动识别最优组件来源位置,显著提升生产订单处理效率和库存准确率。文章还提供了典型问题解决方案和性能优化技巧,适用于离散制造和重复制造场景。 阅读详情

下面的语句有什么错?

string *stringarray = new string[100];

...

delete stringarray;

一切好象都井然有序——一个new对应着一个delete——然而却隐藏着很大的错误:程序的运行情况将是不可预测的。至少,stringarray指向的100个string对象中的99个不会被正确地摧毁,因为他们的析构函数永远不会被调用。

用new的时候会发生两件事:

首先,内存被分配(通过operator new 函数,详见条款7-10和条款m8),

然后,为被分配的内存调用一个或多个构造函数。

用delete的时候,也有两件事发生:

首先,为将被释放的内存调用一个或多个析构函数,

然后,释放内存(通过operator delete 函数,详见条款8和m8)。

对于 delete来说会有这样一个重要的问题:内存中有多少个对象要被删除?答案决定了将有多少个析构函数会被调用。

这个问题简单来说就是:要被删除的指针指向的是单个对象呢,还是对象数组?这只有你来告诉delete。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组:

string *stringptr1 = new string;

string *stringptr2 = new string[100];

...

delete stringptr1;// 删除一个对象

delete [] stringptr2;// 删除对象数组

如果你在stringptr1前加了"[]"会怎样呢?答案是:那将是不可预测的;如果你没在stringptr2前没加上"[]"又会怎样呢?答案也是:不可预测。

而且对于象int这样的固定类型来说,结果也是不可预测的,即使这样的类型没有析构函数。

所以,解决这类问题的规则很简单:

如果你调用new时用了[],调用delete时也要用[]。如果调用new时没有用[],那调用delete时也不要用[]。

在写一个包含指针数据成员,并且提供多个构造函数的类时,牢记这一规则尤其重要。因为这样的话,你就必须在所有初始化指针成员的构造函数里采用相同的new的形式。否则,析构函数里将采用什么形式的delete呢?关于这一话题的进一步阐述,参见条款11。

这个规则对喜欢用typedef的人来说也很重要,因为写typedef的程序员必须告诉别人,用new创建了一个typedef定义的类型的对象后,该用什么形式的delete来删除。举例如下:

typedef string addresslines[4];  //一个人的地址,共4行,每行一个string

                                //因为addresslines是个数组,使用new:

string *pal = new addresslines; // 注意"new addresslines"返回string*,

                                //和"new string[4]"返回的一样

delete时必须以数组形式与之对应:

delete pal;// 错误!

delete [] pal;// 正确

为了避免混乱,最好杜绝对数组类型用typedefs。这其实很容易,因为标准c++库(见条款49)包含有stirng和vector模板,使用他们将会使对数组的需求减少到几乎零。举例来说,addresslines可以定义为一个字符串(string)的向量(vector),即addresslines可定义为vector<string>类型。

把慢点掰开看:在 SAP HANA 中启用 SQL 优化耗时跟踪 SqlOptTime 的实战指南 摘要:SAP HANA 性能排查中,常出现SQL查询时快时慢的现象,表面看似执行问题,实则是编译阶段耗时过长。通过SQL优化跟踪工具SqlOptStep和SqlOptTime,可精准区分编译与执行时间。SqlOptStep展示优化树变化过程,而SqlOptTime则记录各阶段耗时,帮助定位问题根源。启用SqlOptTime需配置traceprofile,建议限定特定用户以减少系统负载。实际案例显示,报表响应慢常由计算视图编译(CeQo)导致,而非执行阶段问题。解决方案包括调整计算视图展开方式或优化基础视图结 阅读详情

相关推荐

Xilinx Blockset Counter计数器模块使用及参数配置

本文详细介绍了Simulink中Xilinx Blockset库Counter模块的使用以及参数说明。

白码王子小张的博客 1093

new与delete正确用法

说明:推荐使用如下宏,可以在一定程度上避免使用空指针,野指针的问题。 #define HW_NEW(var, classname) \     do { \     try \ { \     var = new classname; \ } \     catch (...) \ { \     var = NULL; \ } \     break; \     } w

PeterHuaWei3的专栏 2007

40岁从智驾转具身智能之路

我的工作经历比较复杂,本科毕业后工作2年再次读研的,本科和硕士都是机械专业,硕士毕业后干了5年CAM和机器人再转入到自动驾驶行业。在自动驾驶干了8年,发现自动驾驶已经到了一个瓶颈,再次转行做具身智能。我就谈谈自己的最近这次转型之路。

hzm8341的博客 637

Effective C++:条款5:对应的new和delete要采用相同的形式

下面的语句有什么错?string *stringarray = new string[100]; ... delete stringarray; 一切好象都井然有序——一个new对应着一个delete——然而却隐藏着很大的错误:程序的运行情况将是不可预测的。至少,stringarray指向的100个string对象中的99个不会被正确地摧毁,因为他们的析构函数永远不会被调用。 用new

IT民工 907

FPGA—DHT11数字温湿度传感器

1. DH1T11温湿度传感器与DS18B20温湿度传感器非常类似,都是严格按照时序要求写代码。建议可以比较学习。2. 显示温度与湿度部分的数据处理,采用 X10 进行在数码管上的移一位显示,配合了数码管小数部分的显示特点又区分了温度与湿度。3. 程序是按照一个接一个状态及顺序跳转的,建议使用状态机。说明:本人使用的是野火家Xilinx Spartan6系列开发板及配套教程,以上内容如有疑惑或错误欢迎评论区指出,或者移步B站观看野火家视频教程。

m0_72885897的博客 4778

CAPL通过SecMgrCANoeClient.dll实现AES 128

需要加载SecMgrCANoeClient.dll这个动态库,可以在canoe安装路径下Exec32这个文件夹里找。这个库不是哪版canoe都带,canoe15就没有,11,14是有的。我需要用到的是AES 128 ECB nopadding,这里函数介绍说是padding mode PKCS5,但是最后算出的结果是我可以使用的。CAPL中可以使用下列函数实现AES 128的算法。需要注意输入输出字节的长度。

天赐好车的博客 4928

条款5:对应的new和delete要采用相同的形式 [内存管理]

之前介绍了new,delete要比malloc,free的好处,大家都知道了尽量使用new ,delete,但是在使用new,delete的时候也有些注意的事项 那就是,如果new的时候带‘[ ]’那么delete的时候也要带‘[ ]’因为前一章介绍过,new的时候会调用构造函数,如果 string *stringptr2  = new sting[100]; 那么相当于会对这个数组每个元素掉

sky200543012的专栏 545

uni-app - 将 base64 图片编码转为 Blob 本地文件路径(把base64类型的图片,转换成blob二进制文件流)适用于 uni-app / vue.js / JavaScript

uni-app/vue.js/JavaScript将base64转Blob,uniappapp端如何将图片的base64编码转换成File对象或Blob,uni-app/vue.js/JavaScript中拿到base64转blob对象,uniapp图片base64格式转blob格式方法,uniapp上传图片压缩转base64码与base64转图片路径,Base64/Blob/File图片文件转换,url、base64、blob相互转换方法,读取本地文件为Base64并转成B

🏆 前端领域优质创作者 1万+

effective C++笔记之条款5:对应的new和delete要采用相同的形式

l        用new的时候会发生两件事。首先,内存被分配(通过operator new函数),然后,为被分配的内存调用一个或多个构造函数。用delete的时候,也有两件事发生:首先,为被释放的内存调用一个或多个析构函数,然后,释放内存(通过operator delete函数)。   l        对于delete来说有这样一个问题:内存中有多少个对象要被删除?答案决定了将有多少个析构

philips的专栏 912

QtQuick QML教程(2):qml语法介绍

​ qml一个普通的文本文件,后缀是.qml, 一个qml文件主要由两部分组成:(1) import语句 :这个就像C++中的头文件, 使用 import 导入qml需要的相关模块,可以查询Qt文档进行导入,注意每个版本的Qt模块声明可能都不同,相比于QWidget项目,QtQuick的变动是很大的;(2) QML对象树 :根对象是Window, 然后可以在Window中添加各种控件,例如按钮,文本,菜单等。

琅嬛福地 548

什么是信噪比?信噪比越大好还是越小好?

在进行声音增强的时候,往往需要考虑声音信号和噪声的信噪比,那么信噪比是什么呢?越大越好还是越小越好,此处引入百度百科的解读: 信噪比,英文名称叫做SNR或S/N(SIGNAL-NOISE RATIO),又称为讯噪比。是指一个电子设备或者电子系统中信号与噪声的比例。这里面的信号指的是来自设备外部需要通过这台设备进行处理的电子信号,噪声是指经过该设备后产生的原信号中并不存在的无规则的额外信号(或信息),并且该种信号并不随原信号的变化而变化。 同样是“原信号不存在”还有一种东西叫“失真”,失真和噪声实际上有一

码匀的博客 7万+

读书笔记:Effective C++ 2.0 版,条款5:对应的new和delete要采用相同的形式

条款5:对应的new和delete要采用相同的形式 记得以前调查过,new[]返回的指针指向的内存空间,前面有预留的一个空间存储数组的大小。 chatgpt说每种编译器实现不太一样。但没说明各编译器具体如何实现。 win10 vs2022中实测是前面预留16byte,最前面8byte存储数组的byte大小,数组个数还需要根据类型大小。以下为测试代码和输出结果。

weixin_43172531的博客 185

Motoman机器人离线编程——Motocom32开发简介

欢迎关注Jungle的Motoman机器人离线编程专栏系列文章: Motoman机器人离线编程——Motocom32开发简介 Motoman机器人离线编程——Visio Studio环境配置 Motoman机器人离线编程——Motocom32库函数的使用与封装 Motoman机器人离线编程——Motocom32参考文献及注意事项 Motoman机器人离线编程——MotocomES介绍 ...

冯Jungle的个人博客 8713

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

1、使用new和delete时有哪些形式? new和delete分别有两种形式: (1)对象数组: type*x = new array[]; delete [] array; (2)单一对象: type*x = new singleObject; delete singleObject; 2、使用new和delete分别做了什么? (1)使用new时,有两件事发生: 内存被分配出来(通过 ...

江南又一春 193

IEM模型,地表粗糙度模拟

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【穿越Effective C++】条款16:成对使用new和delete时要采用相同形式——内存管理的精确匹配原则

这个条款揭示了C++动态内存管理中最基本但常被忽视的规则:new/delete形式必须严格匹配。理解这一原则是避免内存泄漏和未定义行为的关键。

沐怡旸的专栏 835

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

如果你在new的表达式中使用[],必须在相应的delete表达式中也使用[];你在new表达式中不使用[],一定不要在相应的delete表达式汇总使用[]。

Ref.Ptr.的博客 269

条款16:成对使用new和delete的时候要采取相同形式

本条款将的核心内容就是new和delete搭配,new []和delete[]搭配。不要混合乱用。 下面我们来解释为什么 1.首先来看new和delete 记住:new/delete是C++中的关键字不是函数,下面我们来看看他们背后的机制为什么比malloc使用起来简单了很多呢。 (下面的例子用自定义类型说明,自定义类型最后在说) 首先来说new,看如下代码 class test {

IT_iverson的博客 528

条款5:使用相同的形式的new和delete

string *stringarray = new string[100]; ... delete stringarray; 上面程序中的stringarray指向的100个string对象中的99个不会被正确地摧毁,因为他们的析构函数永远不会被调用 原因: New和delete都同时做了两件事情 如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就

夜影轩的专栏 476

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

int* parr = new int[5];//分配的是一个数组 delete[] parr; int* pval = new int(5);//分配的是一个变量 delete pval; 与此相伴的一个问题是:如果一个人typedef了一个数组,那么在new和delete时就要小心了:typedef int ARRAY[4]; int* pArray = new ARRAY;

月已满西楼的博客 478

条款5:使用相同形式的new和delete

1,delete的最大问题在于:即将被删除的内存究竟存有多少个对象?它决定有多少个destructor必须被调用. 2,delete删除单个对象; delete[]删除的对象是个数组. [code="cpp"] #include using namespace std; int main() { string* string1=new string; str...

wyjvip333的专栏 130

Effective C++ 第二版 5)new和delete形式 6) 析构函数里的delete

内存管理 1)正确得到: 正确调用内存分配和释放程序; 2)有效使用: 写特定版本的内存分配和释放程序; C中用mallco分配的内存没有用free返回, 就会产生内存泄漏, C++中则是new和delete; new和delete是隐式地调用构造和析构函数的, 而且可以在类内和类外自定义new和delete操作符, 这样带来了复杂性;  条款5

Fix it 1173

条款5和条款16

条款5:了解c++默默编写并调用哪些函数 当我们写一个空类时,编译器会自动帮我们生成默认构造函数、析构函数、拷贝构造、以及赋值运算符。 因此对于这个类: class Demo {}; 编译器会生成: class Demo { public: Demo() {...} Demo(const Demo& demo) {...} ~Demo() {...} Demo& operator=(const Demo& demo) {...} }; 知识点:空类的大小为什么为1?

gaoyuelong的博客 701

delete 和delete[]的区别

new对应delete而new[]对应的是delete[] 释放空间的作用上基本上一样,但是delete[]和delete调用的析构函数的次数是不一样的,delete只调用一次,而delete[]会根据new[]创建的对象数调用析构函数。  条款5:对应的new和delete要采用相同的形式 下面的语句有什么错?

囧小平-云栖隐者 1185
上一篇: 条款4:尽量使用c++风格的注释
下一篇: 条款6:析构函数里对指针成员调用delete
生无涯
博客等级 码龄16年 62粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值