一、几者的区别
- malloc/free 是 c 语言中分配内存空间的函数,malloc 创建空间,free 释放空间。
- new/delete 是 c++中分配内存的操作符,new 创建空间,delete 删除空间。
- new[]/delete[] 也是 C++中的操作符,用来给数组分配和释放空间。
- malloc 只是简单的分配内存空间,而 new 分配空间后会自动调用对象的析构函数。相对应的,free 也只是简单的删除内存空间,delete 则会调用对应析构函数。
二、 malloc/free 和 new/delete 对比
定义一个简单的类:
|
1 2 3 4 5 6 7 8 9 |
class A{ public: A(){ cout << "A()" << endl; } ~A(){ cout << "~A()" << endl; } } |
使用 malloc/free 和 new/delete 分别创建和释放对象:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#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; } |
运行:
|
1 2 3 4 |
---malloc/free--- ---new/delete--- A() ~A() |
可见,malloc 确实没有调用构造函数,free 也没有调用析构函数。
三、 delete 和 delete[]
delete 和 new 对应,delete[]和 new[]对应。 delete 用来删除单个对象,delete[]删除对象数组。
delete 和 delete[]的区别在于后者会调用数组内每一个元素的析构函数,而 delete 只会调用一个。两者在对于内置元素类型时功能一致,对于复杂类型 delete 可能会报错。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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; } |
执行会报错:
![面试题:C++中malloc/free/new/delete/new[]/delete[]的差别](https://www.dyxmq.cn/wp-content/uploads/2019/12/864e1-imageb1f021a814373489.png)
对内置类型而言,互相使用并没有问题。但是对自定义类型而言,delete 和 delete[] 并不能乱用。













评论