Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38449
  • 博文数量: 9
  • 博客积分: 126
  • 博客等级: 入伍新兵
  • 技术积分: 81
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-09 22:29
文章分类

全部博文(9)

文章存档

2013年(3)

2012年(6)

我的朋友

分类: C/C++

2012-12-11 20:24:19

1:malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2:对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3:因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
总结:
1:当我们使用new来动态申请非基本类型对象的内存的时候,就想你写的:T1 *pt = new T1[3];由于new在C++中是一个运算符的角色,所以它是受编译器的控制的。由于自定义类型的对象在创建之前必须要调用构造函数来做一些初始化工作,在对象生命周期结束之前要调用对象的析构函数来清理其所占的内存空间。这些是malloc办不到的,然而new却为了们做了这些工作,这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作,这里编译器调用的是对象的无参构造函数。
2:不管是T1 *pt = new T1[3];还是 int *pi = new int[3];这里的指针都是指向所开辟空间的首地址,这是一段连续的内存空间。如果你是delete pi,不会错是因为即使你销毁了第一个int变量空间,后面的没有销毁
也不会影响的,顶多是内存泄露,因为int变量的销毁不需要调用析构函数的。但是delete pt就不同了,这样子你仅仅是调用第一个对象的析构函数将其销毁掉,但是后面的两个对象都没有调用析构函数,所以在销毁的过程中会抛错的。
3:所以为了以后的规范,都要delete []pointer;

阅读(923) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~