有什么区别 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)   

 

posted @ 2023-02-17 22:42  朱英浩  阅读(33)  评论(0编辑  收藏  举报