malloc/free 和 new/delete的联系和区别

一、malloc/free

 

1、  函数原型:void* malloc(longNumBytes) 

该函数分配了NumBytes个字节,并返回了只想这块空间的的指针。如果分配失败则返回空。

函数原型:Void free(void *firstBytes)

该函数是将之前用malloc分配的内存空间释放,还给操作系统。参数为只想那块空间的首地址。

2、  内存操作:

Malloc函数的参数是接受需要分配的内存字节,如果内存满足请求量则返回:指向被分配内存起始位置地址的指针。

Free函数是释放的是指针指向的内存空间,不是删除指针本身(其中指针指向所释放内存空间的首地址)。

3、  malloc如何申请内存空间?

malloc从堆中获取空间,即函数返回的指针是指向堆中的一块内存。操作系统中有一个记录空闲内存地址的链表,当向操作系统申请时,就会遍历链表,寻找一个空间大于所申请空间的堆节点,然后将该节点从链表中删除,并分配给程序。

调用free函数时,他将用户释放的内存连接到空闲链表上,这是空闲手链表会被切成一块块片段,如过找不到适合的内存,,于是malloc请求延时,对片段进行整理,因此malloc函数在申请空间时一定要进行判断

 

二、new/delete

 

new的时候发生两件事情:

1)  内存被分配(通过operatornew函数)

2)  为被分配的内存调用一个或多个构造函数构建对象

Delete时:

1)  为将要被释放的内存调用一个或者多个析构函数

2)  释放内存(通过operatordelete函数)

注:调用new []开辟空间,必须调用delete[]释放,反之new必须调用delete释放。

 

三、malloc/free和new/delete的本质区别

 

1、  malloc返回值是void *,使用时要进行相对应的显示转换。New不用。

2、  malloc函数只关心内存的总字节数。New自动计算需要分配的内存(创建对象)。

3、  malloc/free 是库函数,new delete是C++运算符。

1)  运算符只能重载不能自定义。

2)  任何函数都可以重载或者覆盖,但通常不能改变运算符内部作用于内置类型的行为,比如不能operator + 让2+3 产生6 的结果。

3)  New/delete能对对象进行构造和析构的调用进而对内存进行详细工作。malloc/free不可以

4)  Malloc分配内存失败返回NULL。new操作符分配内存失败时默认的操作是抛出一个内部的异常,抛出之后,程序跳出new那一行代码不再执行。

5)  Malloc分配的内存永远都是进程的虚拟内存,malloc 是调用VirtualAlloc的。free也只是释放虚拟内存。

6)  因为C++经常调用c函数,而c程序只能调用malloc/free管理动态内存。

 

四、释放的内存会被系统马上回收吗?

 

Free释放内存会调用free函数时,他将用户释放的内存连接到空闲链表上,这是空闲手链表会被切成一块块片段,如过找不到适合的内存,,于是malloc请求延时,对片段进行整理,因此malloc函数在申请空间时一定要进行判断。

 

 

五、使用范例

 

void *malloc(size_t size);

用malloc 申请一块长度为length的整数类型的内存,程序如下:

int *p = (int *)malloc(sizeof(int) * length);

我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。

1. malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void* 转换成所需要的指针类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RHCS集群原理概述

一、 什么是RHCSRHCS是Red Hat Cluster Suite的缩写,也就是红帽集群套件,RHCS是一个能够提供高可用性、高可靠性、负载均衡、存储共享且经济廉价的集群工具集合,它将集群系统中三大集群架构融合一体,可以给web应用、数据库应用等提…

Linux学习笔记11——文件I/O之二

一、文件共享 内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。 1、每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述表  2、内核为所有打开文件维持一张文件表  3、每…

死锁产生的原因及条件、如何避免死锁

一、死锁的定义 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造、成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁…

Git Proxy开关

2019独角兽企业重金招聘Python工程师标准>>> 这个是配合ShadowSocks使用的,在~/.bash_aliases或者~/.bash_profile中设置以下代码: #git proxy enable alias gitpe"git config --global http.proxy socks5://127.0.0.1:1080;git config …

SAP web 开发 (第二篇 bsp 开发 mvc模式 Part2 )

单击第一个图标,第一个图标突出显示,单击第二个图标,第一个变灰,第二个突出显示,反之一样。单击history读取历史记录。 Controller ZCL_SUS_C_ORDER_CHANGE 1. DO_INITmethod DO_INIT. *CALL METHOD SUPER->DO_I…

cuda内存总结

1.shared memory __shared__ 声明为共享内存,将会保存在共享内存中 2.constant memory __constant__ 声明为常量内存,将会保存在常量内存中,常量内存是只读内存,声明时要静态的分配…

平衡二叉查找树插入节点操作( AVLTree ):旋转、调整平衡

AVL树的插入 在向一棵本来高度平衡的AVL树中插入一个新节点时,如果树中某个结点的平衡因子的绝对值 > 1,则出现了不平衡。设新插入结点为P,从结点P到根节点的路径上,每个结点为根的子树的高度都可能增加1,因此在每…

Fork/Join框架介绍

转http://www.infoq.com/cn/articles/fork-join-introduction/ 1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和…

为什么析构函数可以能声明为虚函数,构造函数不可以

转自:http://blog.csdn.NET/chen825919148/article/details/8020550 构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。 不建议在构造函数和析构函数里面调用虚函数。 构造函数不能声明为虚函数的原因是: 1 …

【DFS】NYOJ-325-zb的生日

【题目链接:NYOJ-325】 一道以我名字命名的题目,难道要我生日的时候再A? 思路:依旧深搜,但这个问题应该有一个专有名词吧,看别的博客说是 “容量为 sum/2 的背包问题”,不懂。。。 1 // abs() …

Ubuntu Sudo 无法解析的主机

如果对ubuntu在安装时候的主机名称不满意,可以使用如下的方法进行修改 需要注意的是如果只修改其中一个,使用sudo的时候会报“无法解析主机名称的”错误 1、进入etc目录,使用cat查看hosts文件 alloyubuntu:/etc$ cat hosts -n 1 127.0.0.1 …

信号集操作函数,信号未决、阻塞、递达

转载:信号集操作函数,信号阻塞与未决 一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]; } sigset_t 信号集用来描述信号的集合,每个信号占用一位&a…

管道(Pipe)/createPipe

BOOL CreatePipe(PHANDLE hReadPipe, // 指向读句柄的指针 PHANDLE hWritePipe, // 指向写句柄的指针 LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性的指针 DWORD nSize // 管道大小); 管道(Pipe)实际是用于进程间通信的一段共享内存&…

linux输出文字的颜色特效

有关文字颜色及背景色可以参考:man console_codes-e 用来开启echo中的转义\e 或 \033 来输出Esc符号设置颜色的格式: \e[背景色;前景色;高亮m \033[背景色;前景色;高亮m恢复默认为 \e[0m其中背景色可以被以下数字替换第一个参数&#xff1…

互斥锁和自旋锁分别适用于什么样的业务场景

在多线程并发环境中,当某段代码被多个线程并发执行会导致数据不一致的情况出现时,我们就需要对这段代码加锁以保证线程安全了,我们可以对它施加互斥锁或者自旋锁,具体根据这段代码的执行耗时来定。 互斥锁的特点是:一把…

线程安全和可重入函数的联系与区别

1、 线程安全: 线程安全是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程访问完,其他线程才可以使用。不会出现数据不一致或数据污染。 线程不…

C++11 多线程 基础

C11开始支持多线程编程&#xff0c;之前多线程编程都需要系统的支持&#xff0c;在不同的系统下创建线程需要不同的API如pthread_create()&#xff0c;Createthread()&#xff0c;beginthread()等&#xff0c;使用起来都比较复杂&#xff0c;C11提供了新头文件<thread>、…

LB负载均衡集群--LVS

LB集群&#xff1a;LB集群是load balance 集群的简写&#xff0c;翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、keepalived &#xff0c;商业的硬件负载设备F5、Netscale。LB集群架构&#xff1a;当用户的请求过来时&#xff0c;会直接发到分发器&#xf…

linux 信号处理函数详解

转自&#xff1a;http://blog.csdn.NET/sddzycnqjn/article/details/7285760 1. 信号概念 信号是进程在运行过程中&#xff0c;由自身产生或由进程外部发过来的消息&#xff08;事件&#xff09;。信号是硬件中断的软件模拟(软中断)。每个信号用一个整型常量宏表示&#xff0…

2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索

邱老师降临小行星 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61Description 人赢邱老师和任何男生比&#xff0c;都是不虚的。有一天&#xff0c;邱老师带妹子(们)来到了一个N行M列平面的小行星。对于每一个着陆地点&#xf…