malloc
,free
是C
语言中的库函数,new
,delete
是C++
中的运算符new
自动计算分配内存的大小,malloc
需要手动计算分配内存的大小new
返回对象类型的指针,malloc
返回的是void*
类型,需要显式类型转换new
分配失败抛出异常,malloc
分配失败返回NULL
new
是在自由存储区(堆)进行分配,malloc
通常在堆上分配(malloc
分配的空间是虚拟内存,物理内存的映射对应关系在初始化的时候被分配,即“延迟分配”,物理内存首次访问的时候才被分配)delete
需要类型对象的指针,free
是void*
类型的指针
面试潜在问题:
-
malloc
分配的是物理内存还是虚拟内存?- 虚拟内存
-
malloc
调用后是否立刻得到物理内存?- 并不是,会有“延迟分配”,在初始化的时候才被分配物理内存
-
free(p)
怎么知道该释放多大的空间?-
malloc
时会在分配空间地址前存储“元数据” -
内存换系统会查看“元数据(metadata)”中分配的内存块的大小
-
-
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