面试题: malloc与new的区别

  1. malloc, freeC语言中的库函数, new, deleteC++中的运算符
  2. new自动计算分配内存的大小,malloc需要手动计算分配内存的大小
  3. new返回对象类型的指针,malloc返回的是void*类型,需要显式类型转换
  4. new分配失败抛出异常,malloc分配失败返回NULL
  5. new是在自由存储区(堆)进行分配,malloc通常在堆上分配(malloc分配的空间是虚拟内存,物理内存的映射对应关系在初始化的时候被分配,即“延迟分配”,物理内存首次访问的时候才被分配)
  6. delete需要类型对象的指针,freevoid*类型的指针
面试潜在问题:
  1. malloc分配的是物理内存还是虚拟内存?

    • 虚拟内存
  2. malloc调用后是否立刻得到物理内存?

    • 并不是,会有“延迟分配”,在初始化的时候才被分配物理内存
  3. free(p)怎么知道该释放多大的空间?

    • malloc时会在分配空间地址前存储“元数据”

    • 内存换系统会查看“元数据(metadata)”中分配的内存块的大小

  4. free释放内存之后,内存还在吗?

    • brk返回内存池
    • mmap释放内存
malloc, calloc, realloc

malloc, calloc, 和 realloc 是 C 语言中用于动态内存分配的三个基本函数,它们都定义在 stdlib.h 头文件中。尽管这些函数都是用于分配内存,但它们在用法和行为上有一些关键的区别:

1. malloc (Memory Allocation)

分配指定数量的字节,分配的内存内容是未初始化的,可能包含任何随机数据。当只需要分配内存而不关心其初始内容时使用。

void* malloc(size_t size);
// size:需要分配的内存大小,以字节为单位。

2. calloc (Contiguous Allocation)

为指定数量的元素分配内存,每个元素有指定的大小,并且初始化所有位为零。

void* calloc(size_t num, size_t size);
// num:需要分配的元素数量。
// size:每个元素的大小,以字节为单位。

3. realloc (Re-Allocation)

重新调整之前分配的内存块的大小。

  • 如果新大小大于原始大小,额外的内存区域不会被初始化。
  • 可以扩大或缩小内存块,如果必要,可能会移动内存块到新位置。
void* realloc(void* ptr, size_t new_size);
// ptr:原有内存块的指针。如果 ptr 为 NULL,realloc 的行为类似于 malloc(new_size)。
// new_size:重新分配的内存块的新大小,以字节为单位。

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值