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要采用相同的形式相关推荐

  1. EffectiveC++-条款51:编写 new 和 delete 时需固守常规

    一. 内容 条款50已经解释了什么时候你需要写个自定义的 new 和 delete,但没有解释你编写时应该遵守什么样的规则,接下来我们将介绍其中的规则. 对于 operator new: operat ...

  2. 《Effective C++》读书笔记 条款51:编写new和delete时需要固守常规

    实现一致性operator new 必得返回正确的值,内存不足时必得调用new-handling函数,必须有对付零内存需求的准备,还需避免不慎掩盖正常行驶的new.operator new的返回值,如 ...

  3. 《Effective C++》学习笔记(条款51:编写 new 和 delete 时需固守常规)

    最近开始看<Effective C++>,为了方便以后回顾,特意做了笔记.若本人对书中的知识点理解有误的话,望请指正!!! 条款50 讨论了什么时候需要自定义 operator new 和 ...

  4. 条款51:编写new和delete时需固守常规

    /*编写new和delete时需固守常规*/ //非附属对象必须有独立的大小 #include<iostream> using namespace std; class Base{ pub ...

  5. 【16】成对使用new和delete时要采取相同形式

    简而言之,new时不带[],delete时也不带[]:new时带[],delete时也要带[].如果不匹配,要么造成多销毁对象,导致未定义行为:要么导致少销毁对象,导致内存泄漏. 转载于:https: ...

  6. Android开发笔记(一百五十一)WebView与JavaScript交互的四种形式

    WebView如果作为简单的网页浏览器,对于一般的浏览行为来说,已经足够了.可做为企业开发者,你的App通常要嵌入自家公司的网页,如此一来,还得考虑App与Web之间的消息传递,这就涉及到App的原生 ...

  7. “伊凡 C普”第一式-内存管理

    <条款5>对应的new和delete要采用相同的形式. 这一条没什么可说的,注意new的是不是数组就可以了.其中有两点需要注意: 1.在写一个包含指针数据成员,并且提供多个构造函数的类时, ...

  8. Effective C++ 的52个条款列表

    原文链接: 在线手册 第一章 从C转向C++ 条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而不用malloc和free 条款4: ...

  9. new和delete与内存分配

    一.Effective C++条款16:成对使用new和delete时采用相同的形式 通常我们使用new和delete有两种情形,第一,动态的为单一对象分配内存,第二,动态的创建数组.new和dele ...

最新文章

  1. 前端面试问题(持续更新)
  2. Android应用安全与防范之签名校验
  3. CLLocationManager 位置定位
  4. ML之4PolyR:利用四次多项式回归4PolyR模型+两种正则化(Lasso/Ridge)在披萨数据集上拟合(train)、价格回归预测(test)
  5. 第15章习题解答(一)——《x86汇编语言:从实模式到保护模式》读书笔记40
  6. c语言match,LeetCode第10题: isMatch(C语言)
  7. wien2k 2009 编译方法
  8. 当强人工智能时代来临,哪些人不会失业?
  9. js学习 字符串常用方法
  10. HTTP 1 1与HTTP 1 0的比较
  11. Android音量控制器,音量控制器
  12. 企查猫app破解以及数据解密
  13. 20211129编译RK3399的Android发生编译服务器的CPU看门狗软件死锁的问题
  14. Hbase入门教程和分布式的安装部署
  15. c语言中字符加上48是,【2017年整理】C语言字符型数据(4、5).doc
  16. 数字信号处理的MATLAB实践(一)语音信号的录制和读取
  17. 期货ctp基础知识(合约,开仓,平仓,做多,做空,保证金,手续费)
  18. 配置文件格式详解之终极无惑
  19. 【win8系统开机自动拨号连接宽带图文教程】
  20. 花书笔记:第05章 机器学习基础

热门文章

  1. Java对战.NET,战争与和平的游戏
  2. 从NT向solaris 8移植C/C++应用
  3. Fully decentralized NFT system towards Metaverse: Next generation Seatlab business model
  4. lec 3 of game design
  5. 我对于大学选择的理解
  6. Disruptor-net
  7. C#属性: 利用set实现递归
  8. 蜂鸟智游大数据:为什么出国购物慢慢“OUT”了?
  9. InnoDB的ib_logfile写入策略
  10. 垂直居中 absolute 和 flex 方法