一、申请内存

  • new :内存分配成功,返回该对象类型的指针;分配失败,抛出 bac_alloc 异常。
  • malloc :成功申请到内存,返回指向该内存的指针;分配失败,返回 NULL 指针。

在使用的时候 new、delete 搭配使用,malloc、free 搭配使用。

malloc 的原理:

  • 当开辟的空间小于 128K 时,调用 brk() 函数,通过移动 _enddata 来实现;
  • 当开辟空间大于 128K 时,调用 mmap() 函数,通过在虚拟地址空间中开辟一块内存空间来实现。

malloc 的底层实现:

  • brk() 函数实现原理:向高地址的方向移动指向数据段的高地址的指针 _enddata。
  • mmap 内存映射原理:
    1. 进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域;
    2. 调用内核空间的系统调用函数 mmap(),实现文件物理地址和进程虚拟地址的一一映射关系;
    3. 进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝。

二、释放内存

delete执行过程:

  1. 首先执行该对象所属类的析构函数;
  2. 进而通过调用 operator delete 的标准库函数来释放所占的内存空间。

delete 和 delete [] 的区别:

  • delete 用来释放单个对象所占的空间,只会调用一次析构函数;
  • delete [] 用来释放数组空间,会对数组中的每个成员都调用一次析构函数。

三、new 和 malloc 的区别,delete 和 free 的区别

  • malloc、free 是库函数,而new、delete 是关键字。
  • new 申请空间时,无需指定分配空间的大小,编译器会根据类型自行计算;malloc 在申请空间时,需要确定所申请空间的大小。
  • new 申请空间时,返回的类型是对象的指针类型,无需强制类型转换,是类型安全的操作符;malloc 申请空间时,返回的是 void* 类型,需要进行强制类型的转换,转换为对象类型的指针。
  • new 分配失败时,会抛出 bad_alloc 异常,malloc 分配失败时返回空指针。
  • 对于自定义的类型,new 首先调用 operator new()函数申请空间(底层通过 malloc 实现),然后调用构造函数进行初始化,最后返回自定义类型的指针;delete 首先调用析构函数,然后调用 operator delete() 释放空间(底层通过 free 实现)。malloc、free 无法进行自定义类型的对象的构造和析构。
  • new 操作符从自由存储区上为对象动态分配内存,而 malloc 函数从堆上动态分配内存。(自由存储区不等于堆
  • malloc分配的内存不够的时候,可以用realloc扩容(扩容原理)。new没用这样操作。

说明:
自由存储区与堆的区别:malloc在堆上分配的内存块,使用free释放内存,而new所申请的内存则是在自由存储区上,使用delete来释放。
堆是操作系统维护的一块内存,而自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。堆与自由存储区并不等价。

new和delete,malloc和free相关推荐

  1. new delete malloc free

    1 // 2 int *y=new int; 3 *y=10; 4 5 //或 6 int *y=new int(10);//★ 7 8 delete y; 9 10 //★★★一维数组 11 12 ...

  2. C++:27---new delete malloc free

    上一节我讲了new和delete,有人问这不是和C语言的malloc/free为C的标准库函数差不多么 void* malloc(size_t size)//参数代表字节个数 void free(vo ...

  3. C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free

    内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函数时,函数内局 ...

  4. new/delete与malloc/free的区别与联系详解

    本博客主要说明new/delete,malloc/free的区别与联系,如下: 1.malloc/free为C的标准库函数,函数原型为: void* malloc(size_t size)//参数代表 ...

  5. 有了malloc/free,为什么还要new/delete?

    有了malloc/free,为什么还要new/delete malloc与free是C/C++的标准库函数,new/delete是C++的运算符. 对于非内部数据类型的对象而言,光用malloc/fr ...

  6. C++中的内存管理(new、delete、内存泄漏)

    1. 使用new动态分配内存:若没有足够内存,则new返回0(空值指针null pointer); 2. 不要使用delete释放不是new分配的内存,delete释放指针指向的内存,但不会删除指针本 ...

  7. malloc和new有什么区别

    malloc和new有以下不同: new.delete是操作符,可以重载,只能在c++中使用. malloc.free是函数,可以覆盖,c.c++中都可以使用. new可以调用对象的构造函数,对应的d ...

  8. malloc的内存分配之 malloc(0)的内存分配情况

    #include<iostream> using namespace std; int main() {char *p;if((p=(char *)malloc(0))==NULL)put ...

  9. 深入理解C++ new/delete, new []/delete[]动态内存管理

    在C语言中,我们写程序时,总是会有动态开辟内存的需求,每到这个时候我们就会想到用malloc/free 去从堆里面动态申请出来一段内存给我们用.但对这一块申请出来的内存,往往还需要我们对它进行稍许的& ...

  10. Rational Purify 使用及分析实例(转载)

    本文介绍了 IBM Rational Purify的基本概念和在不同操作系统中使用Purify对C/C++源程序中存在的内存问题进行勘察和分析,并且提供了有关的实例以便读者在实际操作中作为参考. 简介 ...

最新文章

  1. 附录G Netty与NettyUtils
  2. 计算机网络 之 TCP和UDP的端口号解析
  3. 吴裕雄 python 神经网络——TensorFlow实现AlexNet模型处理手写数字识别MNIST数据集...
  4. Zookeeper 终端命令
  5. LeetCode 876. 链表的中间结点(快慢指针)
  6. IREC-GAN:在线推荐中基于模型的对抗训练强化学习
  7. 360解压电脑版安装包_鲁大师电脑版2020下载-鲁大师pc版安装包exe下载v6.1020.3005.1020 官方最新版...
  8. 海康威视错误代码0xf_海康威视嵌入式软件工程师笔试题分享(含解答)
  9. pthread_create()在C和C++使用区别
  10. 企业图谱强势来袭!玩转企业大数据
  11. 黑马程序员 re模块的高级用法 学习笔记
  12. 西门子 S7-200CN CPU 224CN EEPROM芯片
  13. Vegas渲染的时候选什么格式?
  14. VB中.frm .frx .vbp .vbw .scc有什么作用
  15. 中国行政区域shp shx csv 等地图数据下载
  16. 【高清视频压制教程】使用MeGUI压制视频教程(以PSP视频为例)(转载)
  17. 第七颗头骨 忘魂花 凤凰
  18. 马士兵 oracle seton,马士兵Oracle 下
  19. vulnhub靶场之HA: Joker
  20. js制作简单的计算器

热门文章

  1. CentOS 7下配置hadoop 2.8 分布式集群
  2. 双向广搜(DBFS)
  3. 20小时写一篇文章,好看到爆炸的手机壁纸都在这些App里!
  4. node对文件的读取和修改
  5. java 使用LocalDate根据起始时间和结束时间算出周的列表
  6. 修改谷歌浏览器账号密码自动填充功能的默认样式,elementUI
  7. iphone功率测试软件,iPhone原装5W充电头充电功率测试
  8. 真正通俗易懂的傅里叶变换讲解
  9. 那些年解的疑难性能问题 --- ext4碎片整理
  10. Connect Bot 免密登录