new/delete 和malloc/free 的区别
2017-04-28 00:49
267 查看
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
1.C语言的函数malloc和free
(1) 函数malloc和free在头文件中的原型及参数
void * malloc(size_t size)
动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL。
void free(void *ptr)
释放动态申请的内存空间,调用free()后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果ptr为NULL,free不会有任何作用。
(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++中的运算符new和delete
new和delete是C++中的运算符,不是库函数,不需要库的支持,同时,他们是封装好的重载运算符,并且可以再次进行重载。
(1)new 是动态分配内存的运算符,自动计算需要分配的空间,在C++中,它属于重载运算符,可以对多种数据类型形式进行分配内存空间,比如int型、char型、 结构体型和类等的动态申请的内存分配,分配类的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。
(2)delete是撤销动态申请的内存运算符。delete与new通常配对使用,与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/delete与malloc/free之间的联系和区别
(1) malloc/free和new/delete的联系
a)存储方式相同。malloc和new动态申请的内存都位于堆中。申请的内存都不能自动被操作系统收回,都需要配套的free和delete来释放。
b)除了带有构造函数和析构函数的类等数据类型以外,对于一般数据类型,如int、char等等,两组动态申请的方式可以通用,作用效果一样,只是形式不一样。
c)内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
d)两组都需要配对使用,malloc配free,new配delete,注意,这不仅仅是习惯问题,如果不配对使用,容易造成内存泄露。同时,在C++中,两组之间不能混着用,虽说有时能编译过,但容易存在较大的隐患。
(2) malloc/free和new/delete的区别
a)malloc和free返回void类型指针,new和delete直接带具体类型的指针。
b)malloc 和free属于C语言中的函数,需要库的支持,而new/delete是C++中的运算符,况且可以重载,所以new/delete的执行效率高些。 C++中为了兼用C语法,所以保留malloc和free的使用,但建议尽量使用new和delete。
c)在C++中, new是类型安全的,而malloc不是。例如:
int* p = new char[10]; // 编译时指出错误
delete [ ]p; //对数组需要加中括号“[ ]”
int* p = malloc(sizeof(char)*10); // 编译时无法指出错误
free(p); //只需要所释放内存的头指针
d)使用new动态申请类对象的内存空间时,类对象的构建要调用构造函数,相当于对内存空间进行了初始化。而malloc动态申请的类对象的内存空间时,不会初 始化,也就是说申请的内存空间无法使用,因为类的初始化是由构造函数完成的。delete和free的意义分别于new和malloc相反。
e) 不能用malloc和free来完成类对象的动态创建和删除
用代码来详细分析两者之间的关系:
类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。
因此我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
参考:
http://blog.csdn.net/chance_wang/article/details/1609081 http://blog.sina.com.cn/s/blog_92e20f1201018h71.html
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
1.C语言的函数malloc和free
(1) 函数malloc和free在头文件中的原型及参数
void * malloc(size_t size)
动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL。
void free(void *ptr)
释放动态申请的内存空间,调用free()后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果ptr为NULL,free不会有任何作用。
(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++中的运算符new和delete
new和delete是C++中的运算符,不是库函数,不需要库的支持,同时,他们是封装好的重载运算符,并且可以再次进行重载。
(1)new 是动态分配内存的运算符,自动计算需要分配的空间,在C++中,它属于重载运算符,可以对多种数据类型形式进行分配内存空间,比如int型、char型、 结构体型和类等的动态申请的内存分配,分配类的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。
(2)delete是撤销动态申请的内存运算符。delete与new通常配对使用,与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/delete与malloc/free之间的联系和区别
(1) malloc/free和new/delete的联系
a)存储方式相同。malloc和new动态申请的内存都位于堆中。申请的内存都不能自动被操作系统收回,都需要配套的free和delete来释放。
b)除了带有构造函数和析构函数的类等数据类型以外,对于一般数据类型,如int、char等等,两组动态申请的方式可以通用,作用效果一样,只是形式不一样。
c)内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
d)两组都需要配对使用,malloc配free,new配delete,注意,这不仅仅是习惯问题,如果不配对使用,容易造成内存泄露。同时,在C++中,两组之间不能混着用,虽说有时能编译过,但容易存在较大的隐患。
(2) malloc/free和new/delete的区别
a)malloc和free返回void类型指针,new和delete直接带具体类型的指针。
b)malloc 和free属于C语言中的函数,需要库的支持,而new/delete是C++中的运算符,况且可以重载,所以new/delete的执行效率高些。 C++中为了兼用C语法,所以保留malloc和free的使用,但建议尽量使用new和delete。
c)在C++中, new是类型安全的,而malloc不是。例如:
int* p = new char[10]; // 编译时指出错误
delete [ ]p; //对数组需要加中括号“[ ]”
int* p = malloc(sizeof(char)*10); // 编译时无法指出错误
free(p); //只需要所释放内存的头指针
d)使用new动态申请类对象的内存空间时,类对象的构建要调用构造函数,相当于对内存空间进行了初始化。而malloc动态申请的类对象的内存空间时,不会初 始化,也就是说申请的内存空间无法使用,因为类的初始化是由构造函数完成的。delete和free的意义分别于new和malloc相反。
e) 不能用malloc和free来完成类对象的动态创建和删除
用代码来详细分析两者之间的关系:
class Obj { public : Obj(void){ cout << “Initialization” << endl; } ~Obj(void){ cout << “Destroy” << endl; } void Initialize(void){ cout << “Initialization” << endl; } void Destroy(void){ cout << “Destroy” << endl; } }; void UseMallocFree(void) { Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存 a->Initialize(); // 初始化 //… a->Destroy(); // 清除工作 free(a); // 释放内存 } void UseNewDelete(void) { Obj *a = new Obj; // 申请动态内存并且初始化 //… delete a; // 清除并且释放内存 }
类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。
因此我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
参考:
http://blog.csdn.net/chance_wang/article/details/1609081 http://blog.sina.com.cn/s/blog_92e20f1201018h71.html
相关文章推荐
- new delete与malloc free的区别
- malloc/free与new/delete的区别
- C++ delete_new与free_malloc的区别_1
- malloc/free与new/delete的区别
- malloc/free与new/delete的区别
- new/delete 和 malloc/free 的区别
- malloc-free与new-delete的区别.cpp
- new/delete 和malloc/free 的区别一般汇总
- 百度笔试题:malloc/free与new/delete的区别
- new/delete和malloc/free的区别
- malloc/free与new/delete的区别
- 百度笔试题:malloc/free与new/delete的区别
- malloc/free与new/delete的区别 [转]
- malloc/free与new/delete的区别
- malloc/free与new/delete的区别
- 百度笔试题:malloc/free与new/delete的区别 .
- 转:malloc/free与new/delete的区别
- malloc/free 与 new/delete的区别与联系
- malloc/free与new/delete的区别与联系
- malloc/free与new/delete的区别