【为什么】有什么区别 new 和 malloc() ?C++之父谈

此文为C++之父撰写,本篇为翻译

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)   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值