new和malloc

8 篇文章 0 订阅

"new"和"malloc"都是在C++和C语言中用于动态分配内存空间的关键字/函数。

  1. "new"关键字:在C++中,"new"关键字用于在堆上动态分配内存空间。它可以像以下方式使用:

    int* ptr = new int; // 动态分配一个int类型的空间
    

    "new"关键字会自动计算所需的内存大小,并返回一个指向分配内存的指针。在上面的例子中,"ptr"指向了新分配的int类型的内存空间。

  2. "malloc"函数:在C语言中,"malloc"函数用于动态分配内存空间。它需要传入所需的内存大小,并返回一个指向分配内存的指针。可以像以下方式使用:

    int* ptr = (int*)malloc(sizeof(int)); // 动态分配一个int类型的空间
    

    注意,"malloc"函数返回的是void*类型的指针,需要进行类型转换。在上面的例子中,通过(int*)进行了类型转换,将返回的指针转换为int*类型。

    new和malloc底层原理

    malloc 底层实现:

    当开辟的空间小于 128K 时,调用 brk ()函数;当开辟的空间大于 128K 时,调用 mmap()。 malloc 采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将 堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。

    new 底层实现: 关键字 new 在调用构造函数的时候实际上进行了如下的几个步骤:

    1. 创建一个新的对象

    2. 将构造函数的作用域赋值给这个新的对象(因此 this 指向了这个新的对象)

    3. 执行构造函数中的代码(为这个新对象添加属性)

    4. 返回新对象

    new和malloc的区别

    1. new 是操作符,而 malloc 是函数。

    2. new 在调用的时候 先分配内存,在调用构造函数,释放的时候调用析构函数 ;而 malloc 没有构造函数和析构函数。

    3. malloc 需要给定申请内存的大小, 返回的指针需要强转; new 会调用构造函数,不用指定内存的大小,返回指针不用强转。

    4. new 可以被重载 ; malloc 不行

    5. new 分配内存更直接和安全 。

    6. new 发生错误抛出异常 , malloc 返回 null

不同之处:

  • "new"是C++中的关键字,而"malloc"是C语言中的函数。
  • "new"关键字可以自动计算所需的内存大小,而"malloc"函数需要手动传入所需的内存大小。
  • "new"关键字会自动调用构造函数,"malloc"函数仅分配内存,不会对分配的空间进行初始化。

需要注意的是,如果使用"new"关键字分配内存空间,则需要使用"delete"关键字释放内存空间;如果使用"malloc"函数分配内存空间,则需要使用"free"函数释放内存空间。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值