malloc/free 与new/delete 的区别

news/2024/7/3 12:26:33 标签: delete, float, null, 化工, class, 测试
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

malloc/free 的使用要点

class="MsoNormal" style="margin: 0cm 0cm 0pt;">    函数malloc的原型如下:

class="MsoNormal" style="margin: 0cm 0cm 0pt;">       void * malloc(size_t size);

class="MsoNormal" style="margin: 0cm 0cm 0pt;">    malloc申请一块长度为length的整数类型的内存,程序如下:

class="MsoNormal" style="margin: 0cm 0cm 0pt;">       int  *p = (int *) malloc(sizeof(int) * length);

class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。

class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt;">u       malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void * 转换成所需要的指针类型。

class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt;">u       malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。我们通常记不住int, class="tags" href="/tags/FLOAT.html" title=float>float等数据类型的变量的确切字节数。例如int变量在16位系统下是2个字节,在32位下是4个字节;而class="tags" href="/tags/FLOAT.html" title=float>float变量在16位系统下是4个字节,在32位下也是4个字节。最好用以下程序作一次测试

class="MsoDate" style="margin: 0cm 0cm 0pt 21.25pt;">cout << sizeof(char) << endl;

class="MsoDate" style="margin: 0cm 0cm 0pt 21.25pt;">cout << sizeof(int) << endl;

class="MsoDate" style="margin: 0cm 0cm 0pt 21.25pt;">cout << sizeof(unsigned int) << endl;

class="MsoDate" style="margin: 0cm 0cm 0pt 21.25pt;">cout << sizeof(long) << endl;

class="MsoDate" style="margin: 0cm 0cm 0pt 21.25pt;">cout << sizeof(unsigned long) << endl;

class="MsoDate" style="margin: 0cm 0cm 0pt 21.25pt;">cout << sizeof(class="tags" href="/tags/FLOAT.html" title=float>float) << endl;

class="MsoDate" style="margin: 0cm 0cm 0pt 21.25pt;">cout << sizeof(double) << endl;

class="MsoNormal" style="margin: 0cm 0cm 0pt;">    cout << sizeof(void *) << endl;

class="MsoNormal" style="margin: 0cm 0cm 0pt;">   

class="MsoNormal" style="margin: 0cm 0cm 0pt;">    malloc的“()”中使用sizeof运算符是良好的风格,但要当心有时我们会昏了头,写出 p = malloc(sizeof(p))这样的程序来。

class="MsoNormal" style="margin: 0cm 0cm 0pt;"> 

class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt;">u       函数free的原型如下:

class="MsoNormal" style="margin: 0cm 0cm 0pt 20.75pt; text-indent: 21.25pt;">void free( void * memblock );

class="MsoNormal" style="margin: 0cm 0cm 0pt;">    为什么free函数不象malloc函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果pNULL指针,那么freep无论操作多少次都不会出问题。如果p不是NULL指针,那么freep连续操作两次就会导致程序运行错误。

class="MsoNormal" style="margin: 0cm 0cm 0pt;"> 

class="MsoNormal" style="margin: 0cm 0cm 0pt;"> 

class="MsoNormal" style="margin: 0cm 0cm 0pt;"> 

class="MsoNormal" style="margin: 0cm 0cm 0pt;"> 

new/class="tags" href="/tags/DELETE.html" title=delete>delete 的使用要点

class="MsoNormal" style="margin: 0cm 0cm 0pt;">       运算符new使用起来要比函数malloc简单得多,例如:

class="MsoNormal" style="margin: 0cm 0cm 0pt 40.95pt; mso-para-margin-left: 3.9gd;">int  *p1 = (int *)malloc(sizeof(int) * length);

class="MsoNormal" style="margin: 0cm 0cm 0pt 40.95pt; mso-para-margin-left: 3.9gd;">int  *p2 = new int[length];

class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始class="tags" href="/tags/HuaGong.html" title=化工>化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。例如

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">class Obj

class="MsoDate" style="margin: 0cm 0cm 0pt 21.25pt;">{

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">public :

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">    Obj(void);      // 无参数的构造函数

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">    Obj(int x);     // 带一个参数的构造函数

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">}

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">void Test(void)

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">{

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">    Obj  *a = new Obj;

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">    Obj  *b = new Obj(1);   // 初值为1

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">   

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">    class="tags" href="/tags/DELETE.html" title=delete>delete a;

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">    class="tags" href="/tags/DELETE.html" title=delete>delete b;

class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt;">}

class="MsoNormal" style="margin: 0cm 0cm 0pt;">如果用new创建对象数组,那么只能使用对象的无参数构造函数。例如

class="MsoNormal" style="margin: 0cm 0cm 0pt;">    Obj  *objects = new Obj[100];   // 创建100个动态对象

class="MsoNormal" style="margin: 0cm 0cm 0pt;">不能写成

class="MsoNormal" style="margin: 0cm 0cm 0pt;">    Obj  *objects = new Obj[100](1);// 创建100个动态对象的同时赋初值1

class="MsoNormal" style="margin: 0cm 0cm 0pt;">在用class="tags" href="/tags/DELETE.html" title=delete>delete释放对象数组时,留意不要丢了符号‘[]’。例如

class="MsoNormal" style="margin: 0cm 0cm 0pt;">    class="tags" href="/tags/DELETE.html" title=delete>delete []objects;   // 正确的用法

class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.25pt;">class="tags" href="/tags/DELETE.html" title=delete>delete objects; // 错误的用法

class="MsoNormal" style="margin: 0cm 0cm 0pt;">后者相当于class="tags" href="/tags/DELETE.html" title=delete>delete objects[0],漏掉了另外99个对象。


http://www.niftyadmin.cn/n/873639.html

相关文章

mysql schema 表移动_MySQL information_schema库下的表类型信息汇总

MySQL information_schema库下的表类型信息汇总发布时间&#xff1a;2020-08-08 13:22:08来源&#xff1a;ITPUB博客阅读&#xff1a;83作者&#xff1a;chenfeng分区• PARTITIONS&#xff1a;表分区• FILES&#xff1a;存储MySQL NDB 磁盘数据表的文件特权• COLUMN_PRIVILE…

VC下:文件操作的一些API

在VC中,大多数情况对文件的操作都使用系统提供的 API 函数&#xff0c;但有的函数我们不是很熟悉&#xff0c;以下提供一些文件操作 API 函数介绍&#xff1a; 一般文件操作 API CreateFile打开文件要对文件进行读写等操作&#xff0c;首先必须获得文件句柄&#xff0c;通过该…

40句让你坦露心声的经典句子

1、一个人炫耀什么&#xff0c;说明内心缺少什么。 2、一个人越在意的地方&#xff0c;就是最令他自卑的地方。     3、人都有以第一印象定好坏的习惯&#xff0c;认为一个人好时&#xff0c;就会爱屋及乌&#xff0c;认为一个人不好时&#xff0c;就会全盘否认。     …

幽默及顿悟

1,建筑师 【幽默】 一位夫人打电话给建筑师,说每当火车经过时,她的睡床就会摇动. "这简直是无稽之谈!"建筑师回答说,"我来看看." 建筑师到达后,夫人建议他躺在床上,体会一下火车经过时的感觉. 建筑师刚上床躺下,夫人的丈夫就回来了.他见此情形,便…

青蛙 mysql_青蛙学Linux—MySQL常用命令

1、连接和退出MySQL1.1、连接MySQL可以使用第三方客户端工具连接MySQL&#xff0c;也可以使用MySQL提供的命令行工具连接MySQL。命令行工具位于MySQL安装目录下的bin目录中&#xff0c;名为mysql&#xff0c;命令格式如下&#xff1a;./mysql [-h 远程MySQL主机地址] -u 用户名…

views 多文件夹 netcore_asp.net core 实现支持多语言

asp.net core 实现支持多语言Intro最近有一个外国友人通过邮件联系我&#xff0c;想用我的活动室预约&#xff0c;但是还没支持多语言&#xff0c;基本上都是写死的中文&#xff0c;所以最近想支持一下更多语言&#xff0c;于是有了多语言方面的一些实践国际化/本地化介绍国际化…

java list的tostring_关于java的容器类 list,map等的toString()方法

展开全部1.List 中常用的ArrayList的toString() 继承于abstract class AbstractCollection 这个类public String toString(){Iterator iterator1 iterator();if(!636f707962616964757a686964616f31333337616630iterator1.hasNext())return "[]";StringBuilder stri…

java 备份sqlserver数据库_Java实现SQLserver数据的备份与还原

由于项目需求&#xff0c;最近用到了在系统中给用户提供数据备份与还原功能&#xff0c;数据库为SQLserver2005&#xff0c;第一次遇到这种需求&#xff0c;做的过程也遇到了不少问题&#xff0c;特此记录下来&#xff0c;以备不时之需&#xff0c;同时也供有类似需求的童鞋借鉴…