new和delete,malloc和free
一、申请内存
new
:内存分配成功,返回该对象类型的指针;分配失败,抛出 bac_alloc 异常。malloc
:成功申请到内存,返回指向该内存的指针;分配失败,返回 NULL 指针。
在使用的时候 new、delete 搭配使用,malloc、free 搭配使用。
malloc 的原理:
- 当开辟的空间小于 128K 时,调用
brk()
函数,通过移动 _enddata 来实现; - 当开辟空间大于 128K 时,调用
mmap()
函数,通过在虚拟地址空间中开辟一块内存空间来实现。
malloc 的底层实现:
- brk() 函数实现原理:向高地址的方向移动指向数据段的高地址的指针 _enddata。
- mmap 内存映射原理:
- 进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域;
- 调用内核空间的系统调用函数 mmap(),实现文件物理地址和进程虚拟地址的一一映射关系;
- 进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝。
二、释放内存
delete
执行过程:
- 首先执行该对象所属类的析构函数;
- 进而通过调用 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相关推荐
- 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 ...
- C++:27---new delete malloc free
上一节我讲了new和delete,有人问这不是和C语言的malloc/free为C的标准库函数差不多么 void* malloc(size_t size)//参数代表字节个数 void free(vo ...
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函数时,函数内局 ...
- new/delete与malloc/free的区别与联系详解
本博客主要说明new/delete,malloc/free的区别与联系,如下: 1.malloc/free为C的标准库函数,函数原型为: void* malloc(size_t size)//参数代表 ...
- 有了malloc/free,为什么还要new/delete?
有了malloc/free,为什么还要new/delete malloc与free是C/C++的标准库函数,new/delete是C++的运算符. 对于非内部数据类型的对象而言,光用malloc/fr ...
- C++中的内存管理(new、delete、内存泄漏)
1. 使用new动态分配内存:若没有足够内存,则new返回0(空值指针null pointer); 2. 不要使用delete释放不是new分配的内存,delete释放指针指向的内存,但不会删除指针本 ...
- malloc和new有什么区别
malloc和new有以下不同: new.delete是操作符,可以重载,只能在c++中使用. malloc.free是函数,可以覆盖,c.c++中都可以使用. new可以调用对象的构造函数,对应的d ...
- malloc的内存分配之 malloc(0)的内存分配情况
#include<iostream> using namespace std; int main() {char *p;if((p=(char *)malloc(0))==NULL)put ...
- 深入理解C++ new/delete, new []/delete[]动态内存管理
在C语言中,我们写程序时,总是会有动态开辟内存的需求,每到这个时候我们就会想到用malloc/free 去从堆里面动态申请出来一段内存给我们用.但对这一块申请出来的内存,往往还需要我们对它进行稍许的& ...
- Rational Purify 使用及分析实例(转载)
本文介绍了 IBM Rational Purify的基本概念和在不同操作系统中使用Purify对C/C++源程序中存在的内存问题进行勘察和分析,并且提供了有关的实例以便读者在实际操作中作为参考. 简介 ...
最新文章
- 附录G Netty与NettyUtils
- 计算机网络 之 TCP和UDP的端口号解析
- 吴裕雄 python 神经网络——TensorFlow实现AlexNet模型处理手写数字识别MNIST数据集...
- Zookeeper 终端命令
- LeetCode 876. 链表的中间结点(快慢指针)
- IREC-GAN:在线推荐中基于模型的对抗训练强化学习
- 360解压电脑版安装包_鲁大师电脑版2020下载-鲁大师pc版安装包exe下载v6.1020.3005.1020 官方最新版...
- 海康威视错误代码0xf_海康威视嵌入式软件工程师笔试题分享(含解答)
- pthread_create()在C和C++使用区别
- 企业图谱强势来袭!玩转企业大数据
- 黑马程序员 re模块的高级用法 学习笔记
- 西门子 S7-200CN CPU 224CN EEPROM芯片
- Vegas渲染的时候选什么格式?
- VB中.frm .frx .vbp .vbw .scc有什么作用
- 中国行政区域shp shx csv 等地图数据下载
- 【高清视频压制教程】使用MeGUI压制视频教程(以PSP视频为例)(转载)
- 第七颗头骨 忘魂花 凤凰
- 马士兵 oracle seton,马士兵Oracle 下
- vulnhub靶场之HA: Joker
- js制作简单的计算器