linux平台中new内部是通过malloc实现的,new比malloc多一个调用构造函数
malloc只是返回一块荒地给你,而new会给你修好路盖好别墅规划好田地
new和malloc的区别
int main(void)
{
// C++中用新关键字new和delete替代了malloc和free
int *p = new int(53); // p本身分配在栈上,p指向的是一个int类型的数,占4字节
cout << "p = " << p << ", *p = " << *p << endl;
delete p; // 释放p指向的那4个字节的内存
// a分配在heap中,指针p是指向a的,指针p自身是分配在栈上的
int *q = (int *)malloc(4);
*q = 5; // 使用p指向的那4个字节的内存(a)
cout << "q = " << q << ", *q = " << *q << endl;
free(p); // 释放p指向的那4个字节的内存(a)
return 0;
}
malloc是由C库函数,new是由C++运算符关键字
malloc返回值为void *因此需要强转,而new返回值类型为确定的对象指针类型
malloc申请空间大小靠传参确定,而new不需要传参,对象本身大小由编译器自动计算给出
malloc对应free释放,new对应delete和delete[]释放
new会执行类的构造函数而malloc不会
malloc只能申请内存不能带初始化,而new可以带初始化
malloc失败返回NULL,而new失败引发bad_alloc异常
申请和释放数组类型时不同
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不是库函数。
delete与 delete []区别
delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。
delete与new配套,delete []与new []配套
用new分配的内存用delete删除;用new[]分配的内存用delete[]删除。delete[]会调用数组元素的析构函数。
delete[]删除一个数组,delete删除一个指针。