new、delete、malloc、free的关系:

delete会调用对象的析构函数,和new对应,free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

malloc使用:

int* p ;
p = (int*)malloc(sizeof(int)*128);
double* pd = (double*)malloc(sizeof(double)*10);

free使用:

free p;
free pd;

关于new/delete、malloc/free刚详细的区别联系请看下面链接
https://blog.csdn.net/nie19940803/article/details/76358673

delete 和 delete[] 的区别:

delete只会调用一次析构函数,而delete[]会调用每个成员的析构函数。在More Effective C++中有更为详细的解释:“当delete操作符用作于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”
delete与new配套,delete[] 与new[]配套。

实例如下:

#include <iostream>
using namespace std;
class Demo {
public:
	~Demo()
	{
		cout << "析构函数" << endl;
	}
};
int main()
{
	Demo *pDemo = new Demo[10];
	Demo *pDemo1 = new Demo;
	int* pInt1 = new int[10];
	int* pInt2 = new int;

	delete []pDemo;
	/*
	输出:
		析构函数
		析构函数
		析构函数
		析构函数
		析构函数
		析构函数
		析构函数
		析构函数
		析构函数
		析构函数
	*/

	delete pDemo1;
	//输出:析构函数
	//delete []pDemo1;	//不对,编译能通过,但是运行会一直调用析构函数

	//delete []pInt1;
	delete pInt1;	//正确:功能和delete []pInt1一样
	delete[]pInt2;
	//delete pInt2;	//正确:功能和delete []pInt2一样
	/*
	对于内建简单类型,delete p和delete []p功能是一样的 ,因为内建简单类型没有析构函数
	但是对于自定义的复杂数据类型,就不能这样了
	*/
	return 0;
}

这说明:对于内建简单数据类型,delete[] 和delete功能是一样的。对于自定义的复杂数据类型,delete和delete [] 不能互换。delete []删除一个数组,delete删除一个指针。简单来说,new分配的内存用delete删除,用new[]分配的内存用delete []删除。delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

10-03 17:35