现在的位置: 首页 > 综合 > 正文

New/delete与malloc/free的详解

2013年07月31日 ⁄ 综合 ⁄ 共 3021字 ⁄ 字号 评论关闭

 

new/delete与malloc/free的详解 作者:华清远见武汉华嵌 技术支持 曹伟东 内容清单:
 1. C 语言中的函数 malloc 和 free 2. C++ 中的运算符 new 和 delete 3. new/delete 与 malloc/free 之间的联系和区

  
new/delete与malloc/free的详解
作者:华清远见武汉华嵌技术支持曹伟东

内容清单:

1.  C语言中的函数mallocfree

2.  C++中的运算符newdelete

3.  new/deletemalloc/free之间的联系和区别

4.  C/C++程序的内存分配介绍

具体介绍:

1.   C语言的函数mallocfree

 (1) 函数mallocfree在头文件<stdlib.h>中的原型及参数

void * malloc(size_t size)

动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL

              void  free(void *ptr)

释放动态申请的内存空间,调用free()ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果ptrNULLfree不会有任何作用。

(2) C语言中典型用法

        T为任意数据类型

       T *p = ( T * )malloc( sizeof(T) * n)

       if(NULL= =p)

{

       printf(“malloc fail!\n”);

       ……//相关资源收回的处理

       exit(-1);

}

… …//此过程不能改变指针p的指向

free(p);

注意:malloc后通常要对返回值进行判断,避免发生不必要的错误。

(3) 内存说明

malloc函数动态申请的内存空间是在(而一般局部变量存于栈里),并且该段内存不会被初始化,与全局变量不一样,如果不采用手动free()加以释放,则该段内存一直存在,直到程序退出才被系统,所以为了合理使用内存,在不适用该段内存时,应该调用free()。另外,如果在一个函数里面使用过malloc,最好要配对使用free,否则容易造成内存泄露。

2.  C++中的运算符newdelete

newdeleteC++中的运算符,不是库函数,不需要库的支持,同时,他们是封装好的重载运算符,并且可以再次进行重载。

(1)         new是动态分配内存的运算符,自动计算需要分配的空间,在C++中,它属于重载运算符,可以对多种数据类型形式进行分配内存空间,比如int型、char型、结构体型和类等的动态申请的内存分配,分配类的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。

(2)         delete是撤销动态申请的内存运算符。deletenew通常配对使用,与new的功能相反,可以对多种数据类型形式的内存进行撤销,包括类,撤销类的内存空间时,它要调用其析构函数,完成相应的清理工作,收回相应的内存资源。

(3)         典型用法

int *p = new int                       delete p

char *p = new char                  delete p

类的类型 *p = new 类的类型; delete p

//注意,指针p存于栈中,p所指向的内存空间却是在堆中。

                            Obj * p = new Obj[100];                     delete [ ]p;

//注意,new申请数组,delete删除的形式需要加括号“[ ]”,表示对数组空间的操作,总之,申请形式如何,释放的形式就如何。

(4)         内存说明。new申请的内存也是存于中,所以在不需要使用时,需要delete手动收回。

3.  new/deletemalloc/free之间的联系和区别

(1)          malloc/freenew/delete的联系

a)          存储方式相同。mallocnew动态申请的内存都位于堆中。申请的内存都不能自动被操作系统收回,都需要配套的freedelete来释放。

b)          除了带有构造函数和析构函数的类等数据类型以外,对于一般数据类型,如intchar等等,两组动态申请的方式可以通用,作用效果一样,只是形式不一样。

c)          内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。

d)          两组都需要配对使用,mallocfreenewdelete,注意,这不仅仅是习惯问题,如果不配对使用,容易造成内存泄露。同时,在C++中,两组之间不能混着用,虽说有时能编译过,但容易存在较大的隐患。

(2)          malloc/freenew/delete的区别

a)          mallocfree返回void类型指针,newdelete直接带具体类型的指针。

b)          mallocfree属于C语言中的函数,需要库的支持,而new/deleteC++中的运算符,况且可以重载,所以new/delete的执行效率高些。C++中为了兼用C语法,所以保留mallocfree的使用,但建议尽量使用newdelete

c)          C++中, new是类型安全的,而malloc不是。例如:

int* p = new char[10];                    //
编译时指出错误

  delete [ ]p;                                     //对数组需要加中括号“[ ]

int* p = malloc(sizeof(char )*10);    //
编译时无法指出错误

   free (p);                                       //只需要所释放内存的头指针

d)          使用new动态申请类对象的内存空间时,类对象的构建要调用构造函数,相当于对内存空间进行了初始化。而malloc动态申请的类对象的内存空间时,不会初始化,也就是说申请的内存空间无法使用,因为类的初始化是由构造函数完成的。deletefree的意义分别于newmalloc相反。

e)          不能用mallocfree来完成类对象的动态创建和删除。

4.  C/C++程序的内存分配介绍

该部分参考于http://blog.csdn.net/sparkliang/archive/2008/12/30/3650324.aspx

 

1)栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。一般局部变量和函数参数的暂时存放位置。

2)堆内存,亦称动态内存。如mallocnew申请的内存空间。动态内存的生存期由程序员自己决定,使用非常灵活。

3)全局代码区:从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

4)常量区:文字常量分配在文字常量区,程序结束后由系统释放。

5)代码区:存放整个程序的代码,因为存储是数据和代码分开存储的

抱歉!评论已关闭.