malloc和free | new和delete | |
特性 | 函数 | 关键字、操作符 |
类型 | 手动转换类型 | 类型安全 |
调用函数 | 不调用函数 | 自动调用构造析构函数 |
分配失败 | 失败返回null | 失败抛出异常 |
大小 | 手动指定大小 | 自动计算大小 |
malloc
和 free
是C语言标准库中用于动态内存分配的函数
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(sizeof(int)); // 分配一个整数的内存
if (ptr == NULL) {
// 处理内存分配失败的情况
return 1;
}
*ptr = 10; // 使用前需要手动类型转换
// 使用内存...
free(ptr); // 释放内存,不需要类型信息
return 0;
}
new
和 delete
是C++中用于对象动态内存分配的操作符。
#include <iostream>
class MyClass {
public:
int value;
MyClass() {
value = 20; // 构造函数中初始化
}
~MyClass() {
std::cout << "MyClass destroyed." << std::endl; // 析构函数
}
};
int main() {
MyClass* obj = new MyClass; // 分配对象内存并调用构造函数
// 使用对象...
std::cout << obj->value << std::endl; // 输出: 20
delete obj; // 释放对象内存并调用析构函数
return 0;
}
-
语言特性
malloc
和free
是C语言的一部分,也被C++支持,但它们不执行类型安全检查和构造函数或析构函数调用。new
和delete
是C++的操作符,用于对象的内存分配和释放。它们执行类型安全检查,并调用对象的构造函数和析构函数。
-
类型安全
- 使用
malloc
和free
时,需要手动指定所需的数据类型来转换指针。 new
和delete
自动处理类型信息,提供类型安全。
- 使用
-
构造和析构
malloc
不调用构造函数,free
不调用析构函数。new
调用对象的构造函数,delete
调用对象的析构函数。
-
内存分配失败
malloc
在内存不足时返回NULL
指针。new
在内存不足时抛出一个std::bad_alloc
异常。
-
使用范围
malloc
和free
可用于分配任意类型的内存,包括非对象数据。new
和delete
主要用于对象的内存分配和释放。
-
内存分配大小
malloc
需要分配的大小(以字节为单位)作为参数。new
根据对象类型自动确定所需大小
当C++中创建动态数组时,使用new[] 删除时使用delete[