一、基本概念

 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 * 转换成所需要的指针类型。

new/delete和malloc/free的区别一般汇总相关推荐

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

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

  2. ZZ:new/delete 和malloc/free 的区别

    相同点:都可用于申请动态内存和释放内存 不同点: (1)操作对象有所不同. malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光 ...

  3. new/delete与malloc/free的区别和联系

    1.new 是c++中的操作符,malloc是c 中的一个函数 2.new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员 ...

  4. new/delete和malloc/free的区别

    还是先说说区别吧:     1. new/delete是C++里才有的,而new/delete与malloc/free一个显著的区别在于,new是建造一个对象,并调用对象的构造函数来初始化对象,其实在 ...

  5. new/delete和malloc/free的区别(举例说明)(简单点)

    先说说区别: 1. new/delete是C++里才有的. 2. new/delete通常来说是操作符,就是"+","-"一样. 3. new/delete是可 ...

  6. new/delete与malloc/free的区别

    作用: 都是用来申请动态内存和释放动态内存 相同点: 存储方式相同,new与malloc动态申请的内存都位于堆中,无法被操作系统自动回收,需要对应的delete/free来释放空间,且free和del ...

  7. new / delete与malloc / free的异同及实现原理

    文章目录 前言 一.new和delete是如何实现的? 二.new/delete和malloc/free的区别 三.delete p.delete [] p.allocator都有什么作用? 四.de ...

  8. 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?

    目录 一.内存分配模型 1.1 先看内存的分布状况 1.2 动态内存分配 1.3 C语言中分配内存的方式 1.4 C++中动态分配内存的方式 二.new和malloc的区别 2.1 属性 2.2 参数 ...

  9. 面试中常被问到(六)new/delete和malloc/free区别

    new/delete和malloc/free区别 (1)二者都是用来实现动态内存管理,内存空间的开辟(new,malloc)以及内存空间的释放(delete,free) (2)malloc/free是 ...

最新文章

  1. opencv实现分水岭算法
  2. svn 合并和树冲突
  3. Linux 命令快捷键
  4. 4 MM配置-企业结构-定义-维护采购组织
  5. 详解数字电视机顶盒的功能技术与应用3
  6. Lua新闻组的其人其事(一)
  7. 【结构型】Bridge模式
  8. 设计模式---解释器模式(C++实现)
  9. 2010 GCR MVP Open Day
  10. airflow 的使用之 Operators 介绍
  11. .doc文件不显示word图标的解决方法
  12. 【渝粤教育】21秋期末考试建筑设备10327k1
  13. Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言
  14. MySQL系列11—简单优化
  15. VIVADO学习笔记之--拥塞
  16. 改变radio默认样式
  17. 腕能助手android9,篮球教学助手安卓版
  18. vue中根据汉字生成拼音
  19. NLP-生成模型-2016-生成式摘要模型:Seq2Seq+Attention+Copy【Pointer网络的Copy机制解决Decoder端的OOV问题】【抽取式+生成式】【第一个生成式摘要模型】
  20. Android之ListView嵌套,访空间动态展示页面

热门文章

  1. 我写的博客居然是百度搜索第一名 - 感谢国家 …
  2. php 比java 快_php比java要快在哪里
  3. 冒泡和快速排序的时间复杂度_八大排序算法性能分析及总结
  4. 51C语言编译后执行到一半,“C语言” 读书札记之[再续编译执行]
  5. 觅凤c语言教程,C语言程序设计教程 第1章.ppt
  6. 电信计算机知识考试,2020中国电信考试试题——专业知识一
  7. comparator 字符串比较大小_Java中Comparable和Comparator实现对象比较
  8. mysql临时表空间_MySQL 5.7 深度解析: 临时表空间
  9. 常用的python测试脚本_详解Python的单元测试
  10. oracle rowed,oracle bitmap索引内部揭密,欢迎补充