Answers:
表功能比较:
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分配的内存来自“免费存储”,而malloc分配的内存来自“堆”。这两个区域是否相同是实现细节,这是不能将malloc和new混合的另一个原因。
If ptr is NULL, no operation is performed.
new
操作员从免费存储区中分配内存(也称为动态内存)。和堆)的C ++ 14标准,对第3.7.4 动态存储表示“对象可以动态地执行程序(1.9)期间创建,使用新的表达式(5.3.4),并使用删除表达式破坏。”
最相关的区别是,new
运算符先分配内存,然后调用构造函数,再delete
调用析构函数,然后重新分配内存。
new
/ delete
是C ++,malloc
/ free
来自旧的C语言。
在C ++中,new
调用对象构造函数并delete
调用析构函数。
malloc
和free
来自OO之前的黑暗时代,仅分配和释放内存,而不执行对象的任何代码。
new和malloc之间的主要区别是new调用对象的构造函数,而delete的相应调用调用对象的析构函数。
还有其他区别:
new
是类型安全的,malloc
返回类型的对象void*
new
在错误上引发异常,malloc
返回NULL
并设置errno
new
是一个运算符,可以重载,malloc
是一个函数,不能重载
new[]
,它分配数组,比起数组更直观和类型安全 malloc
malloc
可以通过调整源分配的大小realloc
,- new
不能调整源分配的大小
malloc
可以分配一个N字节的内存块,new
必须要求分配一个char
类型数组
查看差异,总结是malloc是C风格的,新的是C ++风格的。使用适合您的代码库的代码。
尽管使用不同的内存分配算法来实现new和malloc是合法的,但是在大多数系统上,新的内部是使用malloc实现的,不会产生系统级的差异。
new
和delete
是C ++ 原语,它们声明一个类的新实例或将其删除(从而为该实例调用该类的析构函数)。
malloc
和free
是C 函数,它们分配和释放内存块(大小)。
两者都使用堆进行分配。malloc
而且free
它们仍然是“低级”,因为它们只是保留了一块可能与指针相关联的内存空间。在该内存周围不会创建任何结构(除非您将C数组视为结构)。
此代码用于使用delete关键字或free函数。但是,当使用'malloc'或'new'创建指针对象并使用delete取消分配对象内存时,即使该对象指针也可以作为类中的调用函数。之后,使用free而不是delete,然后在free语句之后也可以工作,但是当同时使用free语句时,仅指针对象无法调用类中的函数。代码如下:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
输出:
Hello Hi 0x2abfef37cc20