一、几者的区别

  1. malloc/free是c语言中分配内存空间的函数,malloc创建空间,free释放空间。
  2. new/delete是c++中分配内存的操作符,new创建空间,delete删除空间。
  3. new[]/delete[]也是C++中的操作符,用来给数组分配和释放空间。
  4. malloc只是简单的分配内存空间,而new分配空间后会自动调用对象的析构函数。相对应的,free也只是简单的删除内存空间,delete则会调用对应析构函数。

二、案例

定义一个简单的类:

class A{
public:
    A(){
        cout << "A()" << endl;
    }
    ~A(){
        cout << "~A()" << endl;
    }
}

使用malloc/freenew/delete分别创建和释放对象:

#include<iostream>
#include<stdlib.h>
using namespace std;
 
int main{
    cout << "---malloc/free---" << endl;
    A *a1 = (A*)malloc(sizeof(A)); 
    free(a1);
    cout << "---new/delete---" << endl;
    A *a2 = new A;
    delete a2;
    return 0;
}

运行:

---malloc/free---
---new/delete---
A()
~A()

可见,malloc确实没有调用构造函数,free也没有调用析构函数。

三、delete和delete[]

deletenew对应,delete[]new[]对应。delete用来删除单个对象,delete[]删除对象数组。

deletedelete[]的区别在于后者会调用数组内每一个元素的析构函数,而delete只会调用一个。两者在对于内置元素类型时功能一致,对于复杂类型delete可能会报错。

int main(){
    cout << "------" << endl;
    int *p1 = new int[10];
    delete p1;

    cout << "---delete[]---" << endl;
    A *a2 = new A[1];
    delete []a2;

    cout << "---delete---" << endl;
    A *a1 = new A[1];
    delete a1;
    return 0;
}

执行会报错:

可见,对内置类型而言,互相使用并没有问题。但是对自定义类型而言,delete和delete[]并不能乱用。

最后修改:2019 年 12 月 29 日
喜欢就给我点赞吧