动态内存开辟:new/delete,malloc/free区别与联系
2017-03-17 16:17
561 查看
本博客主要说明new/delete,malloc/free的区别与联系,如下:
1.malloc/free为C的标准库函数,函数原型为:
void* malloc(size_t size)//参数代表字节个数
2.在使用上,malloc/free如下:
void func()
{
//开辟一个空间
int* p1=(int*)malloc(sizeof(int));
if(p1==NULL)
{
exit(1);
}
free(p1);
//开辟多个空间
int*p2=(int*)malloc(sizeof(int)*4);
if(p2==NULL)
{
exit(1);
}
free(p2);
}用malloc分别开辟了1个和4个整型大小的空间和并free释放它们;
new/delete如下:void func()
{
//开辟一个空间
int* p1=new int(1);
delete p1;
//开辟多个空间
int*p2=new int[4];
delete []p2;
}由此可知:
(1)malloc开辟空间类型大小需手动计算,new是由编译器自己计算;
(2)malloc返回类型为void*,必须强制类型转换对应类型指针,new则直接返回对应类型指针;
(3)malloc开辟内存时返回内存地址要检查判空,因为若它可能开辟失败会返回NULL;new则不用判断,因为内存分配失败时,它会抛出异常bac_alloc,可以使用异常机制;
(4)无论释放几个空间大小,free只传递指针,多个对象时delete需加[](原因在第3);
3.malloc/free为函数只是开辟空间并释放,new/delete则不仅会开辟空间,并调用构造函数和析构函数进行初始化和清理,如下为new/delete、new[]/delete[]实现机制:
而new[]/delete[]则为:
即过程如上,在开辟大小会多开辟四个字节,用于存放对象的个数,在返回地址时则会向后偏移4个字节,而在delete时则会查看内存上对象个数,从而根据个数count确定调用几次析构函数,从而完全清理所有对象占用内存。
所以解释2原因:对于内置类型若new[]但用delete释放时,没有影响,但若是自定义类型如类时,若释放使用 delete
时,这时则会只调用一次析构函数,只析构了一个对象,剩下的对象都没有被清理。
4.由上图还可以看出new/delete底层是基于malloc/free来实现的,而malloc/free不能基于new/delete实现;
5.因为new/delete是操作符,它调用operator new / operator delete,它们可以被重载,在标准库里它有8个重载版本;而malloc/free不可以重载;
6.对于malloc分配内存后,若在使用过程中内存分配不够或太多,这时可以使用realloc函数对其进行扩充或缩小,但是new分配好的内存不能这样被直观简单的改变;
7.对于new/delete若内存分配失败,用户可以指定处理函数或重新制定分配器(new_handler(可以在此处进行扩展)),malloc/free用户是不可以处理的。
8.最后一点对于new/delete与malloc/free申请内存位置说明,malloc我们知道它是在堆上分配内存的,但new其实不能说是在堆上,C++中,对new申请内存位置有一个抽象概念,它为自由存储区,它可以在堆上,也可以在静态存储区上分配,这主要取决于operator new实现细节,取决与它在哪里为对象分配空间。
所以有一些说法:new在堆上分配内存,可以说是不太精确的。(以上则为我总结的new/delete与malloc/free基本区别联系)
1.malloc/free为C的标准库函数,函数原型为:
void* malloc(size_t size)//参数代表字节个数
void free(void* pointer)//参数代表内存地址new、delete则为C++的操作运算符,它调用的分别为赋值运算符重载operator new()和operator delete();
2.在使用上,malloc/free如下:
void func()
{
//开辟一个空间
int* p1=(int*)malloc(sizeof(int));
if(p1==NULL)
{
exit(1);
}
free(p1);
//开辟多个空间
int*p2=(int*)malloc(sizeof(int)*4);
if(p2==NULL)
{
exit(1);
}
free(p2);
}用malloc分别开辟了1个和4个整型大小的空间和并free释放它们;
new/delete如下:void func()
{
//开辟一个空间
int* p1=new int(1);
delete p1;
//开辟多个空间
int*p2=new int[4];
delete []p2;
}由此可知:
(1)malloc开辟空间类型大小需手动计算,new是由编译器自己计算;
(2)malloc返回类型为void*,必须强制类型转换对应类型指针,new则直接返回对应类型指针;
(3)malloc开辟内存时返回内存地址要检查判空,因为若它可能开辟失败会返回NULL;new则不用判断,因为内存分配失败时,它会抛出异常bac_alloc,可以使用异常机制;
(4)无论释放几个空间大小,free只传递指针,多个对象时delete需加[](原因在第3);
3.malloc/free为函数只是开辟空间并释放,new/delete则不仅会开辟空间,并调用构造函数和析构函数进行初始化和清理,如下为new/delete、new[]/delete[]实现机制:
而new[]/delete[]则为:
即过程如上,在开辟大小会多开辟四个字节,用于存放对象的个数,在返回地址时则会向后偏移4个字节,而在delete时则会查看内存上对象个数,从而根据个数count确定调用几次析构函数,从而完全清理所有对象占用内存。
所以解释2原因:对于内置类型若new[]但用delete释放时,没有影响,但若是自定义类型如类时,若释放使用 delete
时,这时则会只调用一次析构函数,只析构了一个对象,剩下的对象都没有被清理。
4.由上图还可以看出new/delete底层是基于malloc/free来实现的,而malloc/free不能基于new/delete实现;
5.因为new/delete是操作符,它调用operator new / operator delete,它们可以被重载,在标准库里它有8个重载版本;而malloc/free不可以重载;
6.对于malloc分配内存后,若在使用过程中内存分配不够或太多,这时可以使用realloc函数对其进行扩充或缩小,但是new分配好的内存不能这样被直观简单的改变;
7.对于new/delete若内存分配失败,用户可以指定处理函数或重新制定分配器(new_handler(可以在此处进行扩展)),malloc/free用户是不可以处理的。
8.最后一点对于new/delete与malloc/free申请内存位置说明,malloc我们知道它是在堆上分配内存的,但new其实不能说是在堆上,C++中,对new申请内存位置有一个抽象概念,它为自由存储区,它可以在堆上,也可以在静态存储区上分配,这主要取决于operator new实现细节,取决与它在哪里为对象分配空间。
所以有一些说法:new在堆上分配内存,可以说是不太精确的。(以上则为我总结的new/delete与malloc/free基本区别联系)
相关文章推荐
- 动态内存分配- new/delete 和malloc/free的区别
- 动态内存开辟C语言和C++,new与delete,malloc和free,operator new 和operator delete
- new/delete和malloc/free的区别和联系
- new/delete和malloc/free的区别,sizeof的理解和struct内存对齐
- malloc/free与new/delete的区别与联系
- new/delete 与malloc/free的区别与联系
- C++中malloc/free与new/delete的区别及内存分配失败错误处理
- malloc/free与new/delete的区别与联系
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
- new/delete和malloc/free的区别,并说说你在什么情况下会自另行建立自己的内存分配。
- c/c++ 补漏之动态内存分配,malloc,free,new delete (一)
- new/delete与malloc/free之间的联系和区别
- malloc/free 和 new/delete的联系和区别
- malloc/free与new/delete的区别与联系
- 整理:new/delete和malloc/free的区别和联系
- new/delete 和malloc/free 的区别和联系
- malloc/free与new/delete的区别与联系
- New delete 与malloc free 的联系与区别
- malloc,free和new,delete 区别和联系
- c++中malloc,free,new,delete区别和联系