new
/ delete
和malloc
/有free
什么区别?
相关(重复?):在什么情况下我使用malloc vs new?
分配/释放内存
从"免费商店"分配的内存
返回一个完全类型的指针.
new(标准版)永远不会返回NULL(将失败)
用Type-ID调用(编译器计算大小)
有明确的版本来处理数组.
重新分配(以获得更多空间)不能直观地处理(因为复制构造函数).
他们是否调用malloc/free是实现定义的.
可以添加新的内存分配器来处理低内存(set_new_handler)
可以合法地覆盖operator new/delete
用于初始化/销毁对象的构造函数/析构函数
分配/释放内存
从'Heap'分配的内存
返回void*
失败时返回NULL
必须以字节为单位指定所需的大小.
分配阵列需要手动计算空间.
重新分配更大的内存块(无需复制构造函数)
他们不会打电话给新/删除
无法将用户代码拼接到分配序列中以帮助降低内存.
的malloc /免费可以不合法覆盖
表格比较功能:
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
技术上,new分配的内存来自'Free Store',而malloc分配的内存来自'Heap'.这两个区域是否相同是一个实现细节,这是malloc和new不能混合的另一个原因.
最相关的区别是new
运算符分配内存然后调用构造函数,然后delete
调用析构函数然后释放内存.
new
调用对象的ctor,delete
调用dtor.
malloc
&free
只需分配和释放原始内存.
在C++ new
/ delete
相应地调用构造/析构.
malloc
/ free
只需从堆中分配内存.new
/也delete
分配内存.
new
/ delete
是C++,malloc
/ free
来自好老C.
在C++中,new
调用对象构造函数并delete
调用析构函数.
malloc
而且free
,来自OO之前的黑暗时代,只分配和释放内存,而不执行任何对象的代码.
唯一的相似之处在于malloc
/ new
both都返回一个指针,它指向堆上的某些内存,并且它们都保证一旦返回了这样的内存块,除非先释放/删除它,否则它不会再次返回.也就是说,它们都"分配"内存.
但是,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
尽可能多地使用.