条款五:对应的new和delete要采用相同的形式
string *stringarray = new string[100]; ... delete stringarray;
上述程序的运行情况将是不可预测的。至少,stringarray指向的100个string对象中的99个不会被正确地摧毁,因为他们的析构函数永远不会被调用。
用new的时候会发生两件事。首先,内存被分配(通过operator new 函数,详见条款7-10和条款m8),然后,为被分配的内存调用一个或多个构造函数。用delete的时候,也有两件事发生:首先,为将被释放的内存调用一个或多个析构函数,然后,释放内存(通过operator delete 函数,详见条款8和m8)。对于 delete来说会有这样一个重要的问题:内存中有多少个对象要被删除?答案决定了将有多少个析构函数会被调用。
如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组:
string *stringptr1 = new string; string *stringptr2 = new string[100]; ... delete stringptr1;// 删除一个对象 delete [] stringptr2;// 删除对象数组
如果你在stringptr1前加了"[]"会怎样呢?答案是:那将是不可预测的;如果你没在stringptr2前没加上"[]"又会怎样呢?答案也是:不可预测。而且对于象int这样的固定类型来说,结果也是不可预测的,即使这样的类型没有析构函数。所以,解决这类问题的规则很简单:如果你调用new时用了[],调用delete时也要用[]。如果调用new时没有用[],那调用delete时也不要用[]。
这个规则对喜欢用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;// 正确
转载于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3892182.html
条款五:对应的new和delete要采用相同的形式相关推荐
- EffectiveC++-条款51:编写 new 和 delete 时需固守常规
一. 内容 条款50已经解释了什么时候你需要写个自定义的 new 和 delete,但没有解释你编写时应该遵守什么样的规则,接下来我们将介绍其中的规则. 对于 operator new: operat ...
- 《Effective C++》读书笔记 条款51:编写new和delete时需要固守常规
实现一致性operator new 必得返回正确的值,内存不足时必得调用new-handling函数,必须有对付零内存需求的准备,还需避免不慎掩盖正常行驶的new.operator new的返回值,如 ...
- 《Effective C++》学习笔记(条款51:编写 new 和 delete 时需固守常规)
最近开始看<Effective C++>,为了方便以后回顾,特意做了笔记.若本人对书中的知识点理解有误的话,望请指正!!! 条款50 讨论了什么时候需要自定义 operator new 和 ...
- 条款51:编写new和delete时需固守常规
/*编写new和delete时需固守常规*/ //非附属对象必须有独立的大小 #include<iostream> using namespace std; class Base{ pub ...
- 【16】成对使用new和delete时要采取相同形式
简而言之,new时不带[],delete时也不带[]:new时带[],delete时也要带[].如果不匹配,要么造成多销毁对象,导致未定义行为:要么导致少销毁对象,导致内存泄漏. 转载于:https: ...
- Android开发笔记(一百五十一)WebView与JavaScript交互的四种形式
WebView如果作为简单的网页浏览器,对于一般的浏览行为来说,已经足够了.可做为企业开发者,你的App通常要嵌入自家公司的网页,如此一来,还得考虑App与Web之间的消息传递,这就涉及到App的原生 ...
- “伊凡 C普”第一式-内存管理
<条款5>对应的new和delete要采用相同的形式. 这一条没什么可说的,注意new的是不是数组就可以了.其中有两点需要注意: 1.在写一个包含指针数据成员,并且提供多个构造函数的类时, ...
- Effective C++ 的52个条款列表
原文链接: 在线手册 第一章 从C转向C++ 条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而不用malloc和free 条款4: ...
- new和delete与内存分配
一.Effective C++条款16:成对使用new和delete时采用相同的形式 通常我们使用new和delete有两种情形,第一,动态的为单一对象分配内存,第二,动态的创建数组.new和dele ...
最新文章
- 前端面试问题(持续更新)
- Android应用安全与防范之签名校验
- CLLocationManager 位置定位
- ML之4PolyR:利用四次多项式回归4PolyR模型+两种正则化(Lasso/Ridge)在披萨数据集上拟合(train)、价格回归预测(test)
- 第15章习题解答(一)——《x86汇编语言:从实模式到保护模式》读书笔记40
- c语言match,LeetCode第10题: isMatch(C语言)
- wien2k 2009 编译方法
- 当强人工智能时代来临,哪些人不会失业?
- js学习 字符串常用方法
- HTTP 1 1与HTTP 1 0的比较
- Android音量控制器,音量控制器
- 企查猫app破解以及数据解密
- 20211129编译RK3399的Android发生编译服务器的CPU看门狗软件死锁的问题
- Hbase入门教程和分布式的安装部署
- c语言中字符加上48是,【2017年整理】C语言字符型数据(4、5).doc
- 数字信号处理的MATLAB实践(一)语音信号的录制和读取
- 期货ctp基础知识(合约,开仓,平仓,做多,做空,保证金,手续费)
- 配置文件格式详解之终极无惑
- 【win8系统开机自动拨号连接宽带图文教程】
- 花书笔记:第05章 机器学习基础
热门文章
- Java对战.NET,战争与和平的游戏
- 从NT向solaris 8移植C/C++应用
- Fully decentralized NFT system towards Metaverse: Next generation Seatlab business model
- lec 3 of game design
- 我对于大学选择的理解
- Disruptor-net
- C#属性: 利用set实现递归
- 蜂鸟智游大数据:为什么出国购物慢慢“OUT”了?
- InnoDB的ib_logfile写入策略
- 垂直居中 absolute 和 flex 方法