new与malloc()的区别
2015-09-10 08:48
302 查看
new与malloc()有什么区别
在c语言中在堆上动态分配一块空间我们可以用malloc()等函数,在c++中我们可以用new,
那么new与malloc()函数有什么不同?
int *p,*q
p=(int*)malloc(sizeof(int))
q=new int
可以看到
1. malloc()函数的返回值要经过转换后才能使用而new可直接使用
2. malloc()是个函数调用而new是个什么?(操作符)
c++是怎样实现new操作的?
有如下代码
反汇编如下
我们可以看到c++编译器会把new操作符替换为operator new()函数调用,
编译器在遇到new操作符时会计算其后操作数的大小,做为operator new()函数的参数
那么operator new()函数与malloc()函数有何不同?
下面先让我们来看一下malloc()的实现
从反汇编代码中我们可以看到,malloc()在其内部调用了_nh_malloc_dbg()来分配空间
接下来让我们看下operator new()
发现operator new()在其内部调用了_nh_malloc()来分配空间
再让我来看看_nh_malloc()的实现
会发现与malloc()调用了相同的函数去分配空间只不过传给_nh_malloc_dbg()函数的第二个参数不同malloc()的参数叫_newmode,_nh_malloc()的参数叫nhFlag,
下面让我们来看下_nh_malloc_dbg()的注释信息
可以看到该函数的第二个参数是标明是否是operator new()函数调用自己
看到这其实你还看不出malloc()与new有什么明显的重要的区别,如果仅仅是这种区别c++的动态对象为什么只能用new?
带着疑问我们来看如下代码
如果是为对象分配空间?
有如下代码
反汇编如下
你会发现malloc()只会给对象分配8个字节的空间,而new操作符不但会调用operator new()为对象分配空间还会调用构造函数在这块空间上构造对象,,,
这就是malloc()与new最重要的区别了
现在你知道malloc()与new的区别了?
不同:
1. malloc()是一个函数而new是一个操作符
2. malloc()只做一件事分配空间而new操作符不但分配空间而且还调用对象的构造函数在这块空间上构造对象
3. malloc()只返回void *指针而new操作符返回操作对象类型的指针
4. 虽然调用相同的函数分配空间但所用参数不同
相同:
1. 调用了相同的函数分配空间
在c语言中在堆上动态分配一块空间我们可以用malloc()等函数,在c++中我们可以用new,
那么new与malloc()函数有什么不同?
int *p,*q
p=(int*)malloc(sizeof(int))
q=new int
可以看到
1. malloc()函数的返回值要经过转换后才能使用而new可直接使用
2. malloc()是个函数调用而new是个什么?(操作符)
c++是怎样实现new操作的?
有如下代码
反汇编如下
我们可以看到c++编译器会把new操作符替换为operator new()函数调用,
编译器在遇到new操作符时会计算其后操作数的大小,做为operator new()函数的参数
那么operator new()函数与malloc()函数有何不同?
下面先让我们来看一下malloc()的实现
从反汇编代码中我们可以看到,malloc()在其内部调用了_nh_malloc_dbg()来分配空间
接下来让我们看下operator new()
发现operator new()在其内部调用了_nh_malloc()来分配空间
再让我来看看_nh_malloc()的实现
会发现与malloc()调用了相同的函数去分配空间只不过传给_nh_malloc_dbg()函数的第二个参数不同malloc()的参数叫_newmode,_nh_malloc()的参数叫nhFlag,
下面让我们来看下_nh_malloc_dbg()的注释信息
可以看到该函数的第二个参数是标明是否是operator new()函数调用自己
看到这其实你还看不出malloc()与new有什么明显的重要的区别,如果仅仅是这种区别c++的动态对象为什么只能用new?
带着疑问我们来看如下代码
如果是为对象分配空间?
有如下代码
反汇编如下
你会发现malloc()只会给对象分配8个字节的空间,而new操作符不但会调用operator new()为对象分配空间还会调用构造函数在这块空间上构造对象,,,
这就是malloc()与new最重要的区别了
现在你知道malloc()与new的区别了?
不同:
1. malloc()是一个函数而new是一个操作符
2. malloc()只做一件事分配空间而new操作符不但分配空间而且还调用对象的构造函数在这块空间上构造对象
3. malloc()只返回void *指针而new操作符返回操作对象类型的指针
4. 虽然调用相同的函数分配空间但所用参数不同
相同:
1. 调用了相同的函数分配空间