C++ new delete malloc free异同
相同点:都可以用于内存的动态申请和释放
不同点:那可多了
malloc free | new delete | |
---|---|---|
类型 | C/C++语言标准库函数 | C++运算符 |
库文件支持 | 需要 | 不要 |
分配内存的位置 | 堆(是操作系统术语,是一块内存) | 自由存储区(是一个抽象概念,new申请的区域在C++中都叫自由存储区。他可以是堆也可以是静态存储区,具体分类由operator new决定) |
内存分配成功返回值 | void*(需要强制转换成我们需要的类型) | 完整类型指针(返回指针类型和对象匹配) |
内存分配成功返回值类型是否安全 | 不安全 | 安全 |
内存分配失败返回值 | 返回NULL | 抛出bac_alloc异常 |
分配内存的大小 | 自己分配(这样的好处是如果内存不足,自己能用realloc给他扩容) | 由编译器根据类型计算得出(如果内存不足,自己不能给他扩容) |
处理数组 | 需要用户计算数组的大小后进行内存分配 | new[] |
函数重载 | 支持覆盖,不可以重载 | 可以 |
构造函数与析构函数 | 不 | 调用 |
关于最后一点再仔细说说
这个涉及到new,delete实现
new的实现过程是:
1.首先调用名为operator new的标准库函数,分配足够大的原始为类型化的内存,以保存指定类型的一个对象
2.接下来运行该类型的一个构造函数,用指定初始化构造对象
3.最后返回指向新分配并构造后的的对象的指针
delete的实现过程:
1.对指针指向的对象运行适当的析构函数
2.然后通过调用名为operator delete的标准库函数释放该对象所用内存
为什么有了 malloc还要new?
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
malloc里free后直接还给操作系统了吗
不是的,被free回收的内存会首先被ptmalloc使用双链表保存起来,当用户下一次申请内存的时候,会尝试从这些内存中寻找合适的返回。这样就避免了频繁的系统调用,占用过多的系统资源。同时ptmalloc也会尝试对小块内存进行合并,避免过多的内存碎片。
参考链接:https://www.cnblogs.com/XiHua/p/3806443.html