new/delete和malloc/free的区别是什么?
相关(重复?):在什么情况下我使用malloc vs new?
new/delete和malloc/free的区别是什么?
相关(重复?):在什么情况下我使用malloc vs new?
当前回答
New是一个操作符,malloc()是一个函数。 New返回精确的数据类型,而malloc()返回void * (void类型指针)。 Malloc(),内存没有初始化,默认值是垃圾,而在new的情况下,内存用默认值初始化,就像int的情况下用'zero(0)'。 delete和free()都可以用于'NULL'指针。
其他回答
最相关的区别是,new操作符分配内存,然后调用构造函数,而delete操作符调用析构函数,然后释放内存。
有几件事是new做的,malloc没有:
New通过调用该对象的构造函数来构造该对象 New不需要对已分配的内存进行类型转换。 它不需要分配大量的内存,而是需要大量的内存 要构造的对象。
因此,如果使用malloc,则需要显式地执行上述操作,这并不总是实际的。此外,new可以重载,但malloc不能。
总之,如果你使用c++,尽量使用new。
同时,
全局的new和delete可以被覆盖,malloc/free不能。
此外,每个类型都可以重写new和delete。
唯一的相似之处是malloc/new都返回一个指向堆上一些内存的指针,而且它们都保证一旦这样的内存块被返回,它就不会再次返回,除非你先释放/删除它。也就是说,它们都“分配”内存。
然而,通过构造函数、析构函数和操作符重载,new/delete还执行其他任意工作。Malloc /free只分配和释放内存。
事实上,new具有足够的可定制性,它不必从堆中返回内存,甚至根本不必分配内存。但是默认的new可以。
new和malloc之间的主要区别是new调用对象的构造函数,而对应的delete调用对象的析构函数。
还有其他不同之处:
New是类型安全的,malloc返回void*类型的对象 new在错误时抛出异常,malloc返回NULL并设置errno New是运算符,可以重载,malloc是函数,不能重载 New[]分配数组,比malloc更直观和类型安全 malloc派生的分配可以通过realloc调整大小,新派生的分配不能调整大小 malloc可以分配一个n字节的内存块,new必须被要求分配一个数组,比如说char类型
看区别,总结是malloc是C式的,new是c++式的。使用适合您代码库的版本。
虽然使用不同的内存分配算法实现new和malloc是合法的,但在大多数系统上,new是使用malloc在内部实现的,不会产生系统级的差异。