Chinaunix首页 | 论坛 | 博客
  • 博客访问: 233471
  • 博文数量: 69
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 570
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-13 16:57
文章分类

全部博文(69)

文章存档

2011年(1)

2010年(5)

2009年(63)

我的朋友

分类: C/C++

2009-08-03 18:42:44

条款3:尽量用newdelete而不用mallocfree

mallocfree(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。

 

假设用两种方法给一个包含10string对象的数组分配空间,一个用malloc,另一个用new

  

string *stringarray1 =
static_cast(malloc(10 * sizeof(string)));
 
string *stringarray2 = new string[10];

其结果是,stringarray1确实指向的是可以容纳10string对象的足够空间,但内存里并没有创建这些对象。而且,如果你不从这种晦涩的语法怪圈(详见条款m4m8的描述)里跳出来的话,你没有办法来初始化数组里的对象。换句话说,stringarray1其实一点用也没有。相反,stringarray2指向的是一个包含10个完全构造好的string对象的数组,每个对象可以在任何读取string的操作里安全使用。

假设你想了个怪招对stringarray1数组里的对象进行了初始化,那么在你后面的程序里你一定会这么做:

free(stringarray1);
delete [] stringarray2;// 参见:这里为什么要加上个"[]"

调用free将会释放stringarray1指向的内存,但内存里的string对象不会调用析构函数。如果string对象象一般情况那样,自己已经分配了内存,那这些内存将会全部丢失。相反,当对stringarray2调用delete时,数组里的每个对象都会在内存释放前调用析构函数。

既然newdelete可以这么有效地与构造函数和析构函数交互,选用它们是显然的。

////////////////////////////////////

newdeletemallocfree混在一起用也是个坏想法。

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