有什么区别 new 和 malloc() ?
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 = new int[10]; // 分配10个未初始化的整数 int* p3 = new int(10); // 分配1个初始化为10的int int* p4 = new int(); // 氛围1个初始化为0的int int* p4 = new int; // 分配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() 。
发现好的文章:细说new与malloc的10点区别 - melonstreet - 博客园 (cnblogs.com)