普通情况下
两者都是在堆上创建一段空间进行分配
看两种分配的代码:
int *a = new int;
delete a;
int *b = (int *)malloc(sizeof(int));
free(b);
可见两者第一个大的区别new直接就是int类型的,而使用malloc是先将这段空间取出来,然后再转化为int*类型。
- new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配
- new返回的是指定对象的指针,而malloc返回的是void*,因此mallic的返回值一般都需要进行类型转化
- new返回确切的数据类型,而
malloc()
返回void *。 -
new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL
此时可以看出malloc的大小即为后面的大小,那么用new应该怎样分配随意大小的内存呢?
int *a = new int[10];
int *b = (int *)malloc(sizeof(int)*10);
此时数组a应该怎么删除呢?delete a;是普通的删除方法
此时应该用delete[] a;删除
- 申请数组时,new[]一次分配所有内存,多次调用构造函数,搭配使用delete[],delete[]多从调用析构函数,销毁数组中的每个对象,而malloc则只能sizeof(int)*n。
类做对象时
上面讲的是创建普通的对象和数组的方法,看起来两种方法并没有什么大的区别。
下面我们看创建类的对象时,两者的区别。
#include<iostream>
using namespace std;
class A{
public:
A(){
cout << "构造函数" << endl;
}
~A(){
cout << "析构函数" << endl;
}
};
void test(){
cout << "new的情况" << endl;
A *a = new A;
delete a;
cout << "malloc的情况" << endl;
A *b = (A*)malloc(sizeof(A));
free(b);
}
int main()
{
test();
system("pause");
return 0;
}
这个地方区别就出来了:
- 使用new/delete时,会调用类的构造函数和析构函数
- 而使用malloc时,并不会调用构造和析构
区别:
- new不仅会分配一段内存,而且会调用构造函数,malloc不会,
- new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free不会
new/delete和malloc/free可以混用吗?
在普通情况下可以混用。
但是我们看到当创建类的对象时,如果使用new创建而使用free,那么此时仅仅调用了构造函数,而没有调用析构函数,所以就会出错
因此最好还是配套使用
- new创建需要用delete释放
- malloc创建使用free释放
- new int[] 创建需要用delete []释放。
避免出错,最好还是配套使用。