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就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。