new vs malloc
https://www.cnblogs.com/qg-whz/p/5140930.html
1、申请内存位置
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配。
自由存储区不仅可以是堆,还可以是静态存储区,取决于operator new的实现细节。
2、返回类型安全
new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
3、内存分配失败时的返回值
new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。
4、是否需要指定内存大小
使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而malloc则需要显式地指出所需内存的尺寸。
5、是否调用构造析构函数
new分配对象:
- 调用 operator new分配内存
- 调用构造函数在这块内存构造对象
- 返回指针
delete:
- 调用指定内存对象的析构函数
- 调用operator delete释放空间
6、对数组的处理
C++提供了new[]与delete[]来专门处理数组类型,而且会在每个对象的内存上用构造函数初始化对象。而malloc分配的是原始内存,编译器并不知道内存是放对象还是对象数组。
7、new与malloc是否可以相互调用
operator new /operator delete的实现可以基于malloc,而malloc的实现不可以去调用new。
8.是否可以被重载
opeartor new /operator delete可以被重载。而malloc/free并不允许重载。
brk, sbrk
malloc底层使用brk和sbrk申请内存以内存池的方式给用户分配内存,brk(void*p)指定p为堆顶地址(绝对值),sbrk(int a)指定堆顶增加a个字节(相对值)。
malloc() 源码里默认定义了一个阈值:
如果用户分配的内存小于 128 KB,则通过 brk() 申请内存;
如果用户分配的内存大于 128 KB,则通过 mmap() 申请内存;
mmap
- 打开一个文件描述符(可以是一个已存在的文件,或者是-1表示匿名映射)。
- 使用mmap()函数进行内存映射,将文件映射到进程的虚拟内存空间中。
- 对映射得到的内存进行读写操作。
- 使用munmap()函数解除内存映射。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端