new/delete和malloc/free的区别一般汇总

一、基本概念

     malloc/free:

1、函数原型及说明:

      void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。

      void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

 

2.内存操作:

     malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回:指向被分配的内存块起始位置

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

 

new/free:

1.操作时发生事件:

     new的时候会有两个事件发生:1).内存被分配(通过operator new 函数)  2).为被分配的内存调用一个或多个构造函数构建对象

     delete的时候,也有两件事发生:1).为将被释放的内存调用一个或多个析构函数  2).释放内存(通过operator delete 函数)

2.特殊应用:

   使用delete是未加括号,delete便假设删除对象是单一对象。否则便假设删除对象是个数组

   因此,如果在调用new时使用了[],则在调用delete时也使用[],如果你在调用new的时候没有[],那么也不应该在调用时使用[]。

 

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

1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符

2.new能够自动分配空间大小

3.对于用户自定义的对象而言,用malloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能对对象完成动态内存分配和初始化工作的运算符new,以及一个能对对象完成清理与释放内存工作的运算符delete---简而言之 new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。

 

三、联系

既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete,malloc/free必须配对使用。

 

四、使用范例

 

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/509536.shtml

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

相关文章

给IT新人的15个建议:程序员的辛酸反省与总结!

很多人表面上看着老实巴交的,实际上内心比谁都好强、自负、虚荣、甚至阴险。工作中见的多了,也就习惯了。   有一些人,什么事都写在脸上,表面上经常得罪人,甚至让人讨厌。但是他们所表现的又未必不是真性情。 我相信…

Logback日志发送到Kafka

Logback日志发送到Kafka 文章目录Logback日志发送到Kafka一、使用logback将日志发送至kafka1.1 引入依赖1.2 logback.xml简单Demo1.3 兼容性1.4 完整的样例1.5 启动程序收集日志1.6 项目Git地址一、使用logback将日志发送至kafka 1.1 引入依赖 如果存在则跳过该步骤 pom.xml …

01背包问题(DFS解法)

有5个物体,每个物品只有一个,其重量分别是为2,2,6,5,4,价值分别为6,3,5,4,6,背包的载重量为10,求装入背包的物体及总质量。 计算结果:15 package com.lanQiaoFor6;import java.util.ArrayList; import java.util.TreeSet;public class JAVA_6 {static …

Windows下安装Vim插件管理Vundle

VIM是编辑器之神,这个就不用说了,越使用越会体会到VIM的强大与便利。但是它的强大建立在众多插件组合之上,而Vim本身缺乏对插件的有效管理,安装插件并配置_vimrc文件非常不便。gmarik受到Ruby的bunler的启发,开发了vun…

AOE网

博客来源:http://blog.csdn.net/wang379275614/article/details/13990163 认识AOE网 有向图中,用顶点表示活动,用有向边表示活动之间开始的先后顺序,则称这种有向图为AOV网络;AOV网络可以反应任务完成的先后顺序&#…

Spark foreachRDD的使用

常出现的使用误区: **误区一:**在driver上创建连接对象(比如网络连接或数据库连接) 如果在driver上创建连接对象,然后在RDD的算子函数内使用连接对象,那么就意味着需要将连接对象序列化后从driver传递到w…

包子凑数(蓝桥杯)

标题:包子凑数 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来&…

makefile例子(经典)

相信在unix下编程的没有不知道makefile的,刚开始学习unix平台 下的东西,了解了下makefile的制作,觉得有点东西可以记录下。   下面是一个极其简单的例子: 现在我要编译一个Hello world,需要如下三个文件:…

Scala-SparkStreaming 2.2.0 消费 kafka0.10(生产1.0)

Scala-SparkStreaming 2.2.0 kafka0.10(生产1.0) 文章目录Scala-SparkStreaming 2.2.0 kafka0.10(生产1.0)代码Pom.xmlSparkstreaming 2.1.1版本pom文件Spark 2.2 kafka0.10(api使用的0.10,实际生产kafka版本是1.0)代码…

数据结构前缀,后缀,中缀表达式

[cpp] view plaincopy [cpp] view plaincopy <span style"color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; background-color: rgb(255, 255, 255);">举例&#xff1a;</span> (3 4) 5 - 6 就是中缀表达式 - 3…

hdu1232畅通路程(并查集)

参考博客&#xff1a;https://blog.csdn.net/blue_skyrim/article/details/50178287 畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 62854 Accepted Submission(s): 33623 Problem Description 某省调…

gcc的简单使用教程

前几天在学习嵌入式入门时,有一个视频中就是介绍gcc的使用的,看了视频后突然好 想将GCC的手册页翻译出来,后来看到手册页发现实在太多了,凭我个人的能力根本无 法完成,只能写一些自己使用Gcc时的一些常规使用方法. GCC是GNU的成员之一,原意是GNU的C语言编译器,后来发展到不只能…

SparkStreaming参数介绍

SparkStreaming参数介绍 spark.streaming.concurrentJobs :增加job并行度 可以通过集中方法为streaming job配置此参数。 - spark-default中修改 全局性修改&#xff0c;所有的streaming job都会受到影响。 - 提交streaming job是 –conf 参数添加&#xff08;推荐&#x…

还是畅通工程(克鲁斯卡尔算法+并查集)

还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 53997 Accepted Submission(s): 24504 Problem Description 某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅…

makefile深度学习(一个工程实例来学习 Makefile)

转自 http://www.cnblogs.com/OpenShiFt/p/4313351.html?utm_sourcetuicool&utm_mediumreferral Makefile 文件的编写 学习前的准备 需要准备的工程目录结构如下&#xff1a; . ├── add │ ├── add_float.c │ ├── add.h │ └── add_int.c ├── main…

Spark算子介绍

Spark算子 文章目录Spark算子一、转换算子coalesce函数repartition函数flatMap——flatMap变换sample——抽样zip——联结mapValues——对Value值进行变换二、行动Action算子数据运算类行动算子reduce——Reduce操作collect——收集元素countByKey——按Key值统计Key/Value型RD…

数据结构实验之二叉树六:哈夫曼编码

题目描述 字符的编码方式有多种&#xff0c;除了大家熟悉的ASCII编码&#xff0c;哈夫曼编码(Huffman Coding)也是一种编码方式&#xff0c;它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码&#xff0c;称之为最优编码。哈夫曼编码常被用于数据文件压…

hdu3790最短路径问题 (Dijkstra算法)

最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 32544 Accepted Submission(s): 9565Problem Description给你n个点&#xff0c;m条无向边&#xff0c;每条边都有长度d和花费p&#xff0c;给你起…

spark master web ui 端口8080被占用解决方法

spark master web ui 端口8080被占用解决方法 Spark master web ui 默认端口为8080&#xff0c;当系统有其它程序也在使用该接口时&#xff0c;启动master时也不会报错&#xff0c;spark自己会改用其它端口&#xff0c;自动端口号加1&#xff0c;但为了可以控制到指定的端口&a…

GDB调试工具使用教程(博客)

http://blog.csdn.net/haoel/article/details/2879