资料来源: https://www.cn blogs.com/LC gbk/p/14118782.html
一、前言新闻和malloc的知识点,作为c工程师需要知道。 面试中也经常被问到。 因此,这篇文章总结了new和malloc的区别在哪里。
(二、new与malloc的区别2.1属性的区别new/delete )这两个是c中的关键字,需要编译器的支持才能使用。
malloc/free :这两个是库函数,必须引入适当的头文件才能正确使用。
2.2使用区分malloc :必须在申请空间中明确填写申请内存大小;
new :不需要明确输入请求的内存大小。 new根据new的类型分配内存。
实例:
/** malloc/free用例**/
int*ma=(int* ) malloc(4) 4;
free(ma;
/* *新/delete用例**/
int*ne=newint(0;
2.3存储器位置差异new :该操作员分配的存储器区域是自由存储器区域;
malloc :申请的内存位于堆区域。
抄送的内存通常分为堆、堆栈、自由存储区、全局/静态存储区和常量存储区。 自由内存区域以外的内存分布应该是众所周知的。
堆是c语言和操作系统的术语。 堆是操作系统维护的特殊内存,提供动态分配功能。 运行程序malloc ) )时从中分配,free ) )并返回内存。 什么是自由内存呢?
自由存储器区域是c中对象的动态分配和释放的概念,new分配的存储器区域称为自由存储器区域,由delete释放并返回存储器。 自由内存区域可以是堆、全局/静态内存区域等,具体在哪个区域,主要要看new的实现和c编译器默认情况下new申请的内存在哪里。 但是,基本上,许多c编译器默认使用堆实现自由内存,运算符new和delete的内部默认使用malloc和free实现,在堆上也是正确的,在自由内存区域也是正确的在c中,new和delete符号可以重载,因此可以重新实现new的实现代码,使分配的内存位置成为静态存储空间等。 malloc和free是c库函数,不能重载。
2.4返回类型区分如果new操作符的内存分配成功,则返回值为对象类型指针,类型严格匹配对象,无需进行类型转换,因此new是符合类型安全的操作符。
malloc内存分配成功是返回void *,需要通过强制类型转换将void *指针转换为所需的类型。 因此,在c程序中使用new会比malloc更安全、更可靠。
2.5分配失败的差异如果malloc分配内存失败,则返回NULL。 通过判断返回值可以知道分配是否成功
如果new内存分配失败,将抛出bac_alloc异常,并且不返回NULL。 分配失败时,如果不捕捉异常,程序将异常结束。 可以通过异常捕获获取此异常。
2.6定义目标系统调度过程差异的使用new操作符来分配对象内存时会经历三个步骤:
调用operator new函数(对于数组,为operator new[] )以分配足够的内存空间来存储特定类型的对象。 通常,在基本级别,缺省情况下使用malloc实现,除非程序员重新加载new符号。
编译器通过运行适当的构造函数生成对象并传递初始值。
对象生成完成后,返回指向该对象的指针。
使用delete操作符来释放对象内存时会经历两个步骤:
调用对象的析构函数。
编译器调用operator delete (或operator delete[] )函数以释放内存空间。 通常,默认情况下使用free实现,除非程序员重新加载delete符号。
可以自己通过实例进行验证,但这里不展开例程。
2.7扩展内存大小差异malloc :使用malloc分配内存后,发现内存不够。 那么,可以用realloc函数扩展内存大小。 realloc首先判断当前申请的内存后面是否还有足够的内存空间进行扩展。 如果有足够的区域,继续在后面申请区域,返回原来的地址指针。 否则,realloc会向另一个足够大的内存请求空间,将当前内存空间的内容复制到新内存区域,最后返回新的地址指针。
new:new没有扩展内存的机制。
三.总结
最后,如果你也想成为程序员,想快速掌握编程,赶紧学习企鹅圈子!
有资深专业软件开发工程师,在线解答你所有的疑问~编程语言入门“so easy”
编程学习书:
编程学习视频: