malloc() 是一个以数字(字节)作为参数的函数; 它返回一个 void* 指向单元化存储。 new 是一个运算符,它接受一个类型和(可选)该类型的一组初始值设定项 作为它的论点; 它返回一个指向其类型的(可选)初始化对象的指针。 当您要分配用户定义类型的对象时,差异最为明显 具有独特的初始化语义。 例子:
class Circle : public Shape {
public:
Circle(Point c, int r);
// 没有默认构造函数
// ...
};
class X {
public:
X(); // 有默认构造函数
// ...
};
void f(int n)
{
void* p1 = malloc(40); // 分配 40 个(未初始化的)字节
int* p2 = newint[10]; // 分配10个未初始化的整数
int* p3 = newint(10); // 分配1个初始化为10的int
int* p4 = newint(); // 氛围1个初始化为0的int
int* p4 = newint; // 分配1个未初始化的int
Circle* pc1 = new Circle(Point(0,0),10); // 分配一个构造的Circle
// 带有指定的参数
Circle* pc2 = new Circle; // 错误,没有默认构造函数
X* px1 = new X; // 分配一个默认构造的X
X* px2 = new X(); // 分配一个默认构造的X
X* px2 = new X[10]; // 分配10个默认构造的X
// ...
}
请注意,当您使用“(值)”表示法指定初始化程序时, 您将使用该值进行初始化。 不幸的是,您不能为数组指定它。 通常, vector 是自由存储分配数组的更好替代方案 (例如,考虑异常安全)。
每当您使用 malloc() 时,您都必须考虑初始化并将返回指针转换为正确的类型。 您还必须考虑是否获得了适合您使用的字节数。 当您考虑初始化时,malloc() 和 new 之间没有性能差异。
malloc() 通过返回 0 报告内存耗尽。 new 通过抛出异常来报告分配和初始化错误。
创建的对象 new 被 delete 销毁。 分配的内存区域 malloc() 释放 由free() 。