EC笔记:第三部分:16成对使用new和delete

我们都知道,申请的资源,使用完毕后要释放。但是这个释放动作,一定要注意。

举个例子,很多人动态分配的资源,在使用之后,往往直接调用了delete,而不管申请资源的时候用的是new还是new[]。

如下:

#include <iostream>

using
namespace std;

int
main(){

int
*p;

p=new
int[256];

//某些操作

delete p;
//错误,和分配资源时的操作不匹配

}

但是有时候,我们感觉写的代码是没有问题的,然而却犯了一些很隐晦的错误。比如以下代码:

#include <iostream>

using
namespace std;

int
main(){

typedef
int MyArray[256];

MyArray *p=new MyArray;

//一些操作

delete p;
//错误,此时应该使用delete[]

}

当我们使用typedef的时候,往往无法看清楚,原有的类型是什么。

不过这个情况也很好避免,在c++中,我们合理的使用vector,string等容器,几乎就可以避免数组的使用。而且尽量不要用typedef去定义一个数组类型。

忠告:

  1. 成对地使用new和delete
  2. 不要用typedef去定义一个数组类型,而是使用标准库提供的容器。
时间: 2024-10-05 10:31:52

EC笔记:第三部分:16成对使用new和delete的相关文章

《CSS网站布局实录》学习笔记(三)

第三章 CSS网页布局与定位 3.1 div 几乎XHTML中的任何标签都可以用于浮动与定位,而div首当其冲.对于其他标签而言,往往有它自身存在的目的,而div元素存在的目的就是为了浮动与定位. 3.1.1 div是什么 div是XHTML中制定的.专门用于布局设计的容器对象.在传统表格式布局中,之所以能够进行页面的排版布局设计,完全依赖于表格对象table.如今,接触另一种布局方式--CSS布局.div正是这种布局方式的核心对象.仅从div的使用上说,做一个简单的布局只需要依赖两样东西:di

Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算方法,更是一种解决问题的新思维.新思路.将原先看似可以一条龙似的处理一刀切成两端,一端是Map.一端是Reduce,Map负责分,Reduce负责合. 1.MapReduce排序 问题模型: 给出多个数据文件输入如: sortfile1.txt 11 13 15 17 19 21 23 25 27

Cookie学习笔记(三)

11.4.3  删除会话变量 在使用会话时,需要创建一个方法来删除会话数据.在当前示例中,当用户注销时,这是必要的. 虽然cookie系统只需要发送另一个cookie来销毁现有的cookie,但是会话的要求更高,因为既要考虑客户上的cookie,又要考虑服务器上的数据. 要删除单独一个会话变量,可以使用unset()函数(它可以处理PHP中的任何变量): unset($_SESSION['var']); 要删除每个会话变量,可以重置整个$_SESSION数组: $_SESSION = array

JUnit4学习笔记(三):assertThat语法与Matcher

一.使用JUnit的一般测试语法 org.junit.Assert类里有各种断言方法,大部分情况下我们会像下面这个例子一样编写测试: 1 public class AssertThatTest { 2 private int id = 6; 3 private boolean trueValue = true; 4 private Object nullObject = null; 5 private String msg = "Hello World"; 6 7 @Test 8 pu

Java超简明入门学习笔记(三)

Java编程思想第4版学习笔记(三) 第五章 初始化与清理(构造器和垃圾回收机制)   Java有和C++类似的构造函数来为新创建的对象执行初始化及完成一些特殊的操作,有的类数据成员可能会被初始化几次,它们的初始化次序和次数是根据程序决定的,可以用重载的构造函数以不同的形式对一个对象初始化,重载的构造函数之间可以通过this互相调用.最后,本章讲了finalize()函数和简单的GC机制,也提到了如何创建一个数组.   知识点1:P76,5.1,定义构造函数 当对象被创建时,构造函数会自动被调用

内部类学习笔记(三)匿名内部类

这篇不转载了,自己来写,因为匿名内部类是内部类系列里我认为最难理解的. A.继承式的匿名内部类. 引用转载代码: 结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象. 建立匿名内部类的关键点是重写父类的一个或多个方法.再强调一下,是重写父类的方法,而不是创建新的方法.因为用父类的引用不可能调用父类本身没有的方法!创建新的方法是多余的.简言之,参考多态. 这里可能大家看的比较迷糊,尤其是 Car car = new Car(){ pub

C++Primer第5版学习笔记(三)

C++Primer第5版学习笔记(三) 第四/五章的重难点内容 你可以点击这里回顾第三章内容 因为第五章的内容比较少,因此和第四章的笔记内容合并.   第四章是和表达式有关的知识,表达式是C++的基础设施,本章由三部分组成:         1.表达式概念基础,包括表达式的基本概念,左值和右值的概念,优先级结合律,求值顺序.  2.各种运算符,主要包括算数\关系\逻辑\赋值\递增递减\成员访问\条件\位运算\sizeof\逗号运算符 这10种运算符.  3.类型转换,包括隐式和显式两种转换的规则

自学it18大数据笔记-第三阶段Spark-day14;Spark-day15(开始试水找工作了)——会持续更新……

写在最前:转行大数据领域,没报班,自学试试,能坚持下来以后就好好做这行,不能就--!准备从现有这套it18掌的视屏残本开始--自学是痛苦的,发博客和大家分享下学习成果--也是监督自己,督促自己坚持学下去. (教学视屏是it18掌做活动送的,视屏不是很全,课堂笔记和源码等课堂相关资料也未放出,但徐培成老师课讲的真心很好,感兴趣的不妨听听,特此感谢it18掌--帮他们打打广告) 笔记为自学时记录,如有错误,欢迎指正,不胜感激!现已广州转移至上海,开始试水找工作了,欢迎小伙伴们加qq或微博沟通交流(Q

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

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