使用代码了解new/delete与malloc/free的区别与联系

普通情况下

两者都是在堆上创建一段空间进行分配

看两种分配的代码:

    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;
}

这个地方区别就出来了:

  1. 使用new/delete时,会调用类的构造函数和析构函数
  2. 而使用malloc时,并不会调用构造和析构

区别:

  • new不仅会分配一段内存,而且会调用构造函数,malloc不会,
  • new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free不会

new/delete和malloc/free可以混用吗?

在普通情况下可以混用。

但是我们看到当创建类的对象时,如果使用new创建而使用free,那么此时仅仅调用了构造函数,而没有调用析构函数,所以就会出错

因此最好还是配套使用

  1. new创建需要用delete释放
  2. malloc创建使用free释放
  3. new int[] 创建需要用delete []释放。

避免出错,最好还是配套使用。

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/111188183