条款3:尽量用new和delete而不用malloc和free

转载 2006年05月29日 21:33:00

条款3:尽量用new和delete而不用malloc和free

 

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

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

  

string *stringarray1 =
static_cast<string*>(malloc(10 * sizeof(string)));

string *stringarray2 = new string[10];

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

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

 

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

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

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

把new和delete与malloc和free混在一起用也是个坏想法。对一个用new获取来的指针调用free,或者对一个用malloc获取来的指针调用delete,其后果是不可预测的。大家都知道“不可预测”的意思:它可能在开发阶段工作良好,在测试阶段工作良好,但也可能会最后在你最重要的客户的脸上爆炸。

new/delete和malloc/free的不兼容性常常会导致一些严重的复杂性问题。举个例子,<string.h>里通常有个strdup函数,它得到一个char*字符串然后返回其拷贝:

 

char * strdup(const char *ps);	// 返回ps所指的拷贝

在有些地方,c和c++用的是同一个strdup版本,所以函数内部是用malloc分配内存。这样的话,一些不知情的c++程序员会在调用strdup后忽视了必须对strdup返回的指针进行free操作。为了防止这一情况,有些地方会专门为c++重写strdup,并在函数内部调用了new,这就要求其调用者记得最后用delete。你可以想象,这会导致多么严重的移植性问题,因为代码中strdup以不同的形式在不同的地方之间颠来倒去。

c++程序员和c程序员一样对代码重用十分感兴趣。大家都知道,有大量基于malloc和free写成的代码构成的c库都非常值得重用。在利用这些库时,最好是你不用负责去free掉由库自己malloc的内存,并且/或者,你不用去malloc库自己会free掉的内存,这样就太好了。其实,在c++程序里使用malloc和free没有错,只要保证用malloc得到的指针用free,或者用new得到的指针最后用delete来操作就可以了。千万别马虎地把new和free或malloc和delete混起来用,那只会自找麻烦。

既然malloc和free对构造函数和析构函数一无所知,把malloc/free和new/delete混起来用又象嘈杂拥挤的晚会那样难以控制,那么,你最好就什么时候都一心一意地使用new和delete吧。

new/delete和malloc/free的区别(举例说明)(简单点)

先说说区别: 1. new/delete是C++里才有的。 2. new/delete通常来说是操作符,就是"+","-"一样。 3. new/delete是可以重载的,而重载之后,就成为了函数...
  • shixin_0125
  • shixin_0125
  • 2015年03月25日 10:41
  • 902

malloc/free与new/delete异同点

malloc/free与new/delete异同点 相同点malloc/free与new/delete都可以用于申请动态内存和释放内存,他们申请的空间都在堆上分配。 不同点1)操作对象不同malloc...
  • yzhang6_10
  • yzhang6_10
  • 2016年04月12日 18:33
  • 468

既然有了malloc/free为何还要new/delete?

既然有了malloc/free为何还要new/delete? 最近开发过程中,有个疑问,就是C中已经有了malloc 和free 为何在C++中又有new/delete呢(不负责任的回答是前者是C里面...
  • gggg_ggg
  • gggg_ggg
  • 2015年01月07日 14:09
  • 2348

malloc/free和new/delete的区别

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要...
  • chance_wang
  • chance_wang
  • 2007年05月14日 22:31
  • 15395

尽量用new和delete而不用malloc和free

尽量用new和delete而不用malloc和free(转载自:http://www.kuqin.com/effectivec2e/ch01a.htm) malloc和free(及其变体)会产生...
  • qiufei230
  • qiufei230
  • 2011年08月13日 17:39
  • 269

关于new和malloc以及delete和free是否可以混用

/* *1》当申请的空间是内置类型时,delete和free可以混用 *2》当申请的空间是自定义类型时, *       1>若没有析构函数,delete和malloc可以混用,有[]和没有[]...
  • u014774781
  • u014774781
  • 2015年08月21日 16:08
  • 1294

Effective C++:条款1:尽量用const和inline而不用#define

这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句: #define ASPECT_RATIO 1.653 编译器会...
  • wangqiulin123456
  • wangqiulin123456
  • 2012年12月01日 22:30
  • 1416

C++ 中 malloc/free 与 new/delete 浅析

new/delete 通常来说是操作符,就是"+","-"一样,malloc/free 是 C++/C 语言的标准库函数 —— 本质区别。本文主要从以下5各方面比较、分析 malloc/free,ne...
  • u013630349
  • u013630349
  • 2015年04月08日 21:43
  • 931

Effective C++学习笔记:条款3:尽量用new和delete而不用malloc和free

尽量不在C++中使用malloc和free,因为它们和new ,delete混用会导致错误发生概率大大增加。string *stringarray1 =static_cast(malloc(10 * ...
  • qinmelody
  • qinmelody
  • 2008年01月16日 20:51
  • 290

条款3:尽量用new和delete而不用malloc和free

malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new:str...
  • developinglife
  • developinglife
  • 2011年06月30日 12:17
  • 333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:条款3:尽量用new和delete而不用malloc和free
举报原因:
原因补充:

(最多只允许输入30个字)