MrD*_*ase 279 c++ memory-management
new/ delete和malloc/有free什么区别?
相关(重复?):在什么情况下我使用malloc vs new?
Mar*_*ork 460
表格比较功能:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
Run Code Online (Sandbox Code Playgroud)
技术上,new分配的内存来自'Free Store',而malloc分配的内存来自'Heap'.这两个区域是否相同是一个实现细节,这是malloc和new不能混合的另一个原因.
Tra*_*rap 80
最相关的区别是new运算符分配内存然后调用构造函数,然后delete调用析构函数然后释放内存.
Jam*_*ran 29
new调用对象的ctor,delete调用dtor.
malloc&free只需分配和释放原始内存.
Tre*_*reb 13
new/ delete是C++,malloc/ free来自好老C.
在C++中,new调用对象构造函数并delete调用析构函数.
malloc而且free,来自OO之前的黑暗时代,只分配和释放内存,而不执行任何对象的代码.
Ste*_*sop 10
唯一的相似之处在于malloc/ newboth都返回一个指针,它指向堆上的某些内存,并且它们都保证一旦返回了这样的内存块,除非先释放/删除它,否则它不会再次返回.也就是说,它们都"分配"内存.
但是,new/ delete通过构造函数,析构函数和运算符重载执行任意其他工作.malloc/ free只有分配和释放内存.
实际上,new可以充分定制,它不一定从堆返回内存,甚至根本不分配内存.但默认情况下new.
new和malloc之间的主要区别在于new调用对象的构造函数,而相应的delete调用调用对象的析构函数.
还有其他差异:
new是类型安全的,malloc返回类型的对象void*
new在错误时抛出异常,malloc返回NULL并设置errno
new是一个操作符,可以重载,malloc是一个功能,不能重载
new[],分配数组,比直观和类型安全 malloc
malloc- 来源分配可以通过以下方式调整大小realloc: - new来源分配无法调整大小
malloc可以分配一个N字节的内存块,new必须要求分配一个数组,比如char类型
看一下差异,总结一下是malloc是C-esque,new是C++ - esque.使用适合您的代码库的那个.
尽管使用不同的内存分配算法实现new和malloc是合法的,但在大多数系统中,new使用malloc在内部实现,不会产生系统级差异.
有一些事情new没有malloc做到:
new 通过调用该对象的构造函数来构造对象new 不需要对已分配的内存进行类型转换.所以,如果你使用malloc,那么你需要明确地做上面的事情,这并不总是实际的.另外,new可以重载但malloc不能.
总之,如果您使用C++,请尝试new尽可能多地使用.