一个是c语言的关键字,另一个是c的关键字。
malloc需要分配一个内存,指定内存大小,并返回分配的内存指针。
news是运算符,重新加载并恢复正常的也是指针。
但是,这两者的指针返回的类型不同。 malloc返回无类型指针,需要转换。 new返回其自身带有类型的指针。 其语法的意思是,在new上附加类型的构造函数,进行连接和解读。 也就是说,new运算符首先去查找内存,或者接收内存地址,然后构造函数初始化该内存。 对此,malloc表示
因此,new运算符缺省情况下应该调用malloc,new运算符是为支持面向对象开发而设计的运算符。
因此,new与构造函数成对出现,其逆操作为delete,delete与构造函数一起出现,malloc为free。
当然,他们分配内存的位置,正如我们所说,因为new的下层通常调用malloc,所以他们的内存分配位置位于动态内存空间,也就是堆空间。 所谓的new相关自由内存区域的范围概念比堆内存大,这一点尚不为人所知。 但是,使用new关键字的操作的所有内存区域都是自由内存区域。
new关键字也可以在不分配内存的情况下传递地址。 stl编程显示了相关语法,就像construct方法一样。 这意味着只需根据原始地址初始化内存空间,无需再次分配。 这在stl容器中是非常常见的。
在异常处理中,malloc在内存分配失败时返回null,因此检测分配是否成功也与知道指针为null、判断new关键字失败时是否抛出异常相同,即new
try{ int *a=new int (; ) catch(bad_alloc )……) c的异常系统和Java的异常系统还不相似,但关于有无异常继承系统[参考1],这一点尚不清楚。
在复合数据结构上,例如排列、malloc的处理方法,给整体分配一个存储器,那时统一释放。 也就是说,调用malloc得到的这个指针保持所分配的存储器的大小,在free时,自然地释放该分配时的大小。 new关键字是数组的特殊语法,用于指定分配的元素数,new根据类型自动计算分配的内存大小,因此调用程序在使用new运算符时必须指定元素数。
int arr[3]=new int[3]; 而且new作为运算符,可以重载.这只是见过,没用过. c语言没有重载的概念.
new的重载如下
//这些版本可能会抛出异常的void *操作器新(size _ t )。 void *操作器new [ ]; Void *操作器删除(Void * )否执行; void *操作器delete [ (void *0) noexcept; //这些版本是异常的void*operatornew(size_t,nothrow_t ) noexcept; void *操作器new [ (size _ t,nothrow_t ) ]; void *操作器删除(void *,nothrow_t ) noexcept; void *操作器delete [ (void * 0,nothrow_t ) noexcept; 还有其他版本。 禁止重载。
不能重新定义void*操作器new (size _ t,void* ) /此版本的名为操作器new的操作器new。 不分配任何内存。 只需要返回指针参数。 然后,右边的new表达式负责用place_address指定的地址初始化对象
关于二次分配内存问题,malloc有兄弟姐妹。 realloc会判断该内存的后续顺序是否空闲,并当场扩大内存。 new屏蔽了内存分配的详细情况。 也就是说,不能提及二次分配。
最后添加的是new关键字有钩子函数,new_handler,应用和new失败后应该怎么做的步骤。 (这也鲜为人知)
[1] C借鉴异常分配机制
3358 www.cn blogs.com/qg-whz/p/5136883.htmlc
[2]new和malloc的区别
3359 www.cn blogs.com/qg-whz/p/5140930.html