C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用。

两者相同点

1.都可以申请动态堆内存。

两者不同点

1.new/delete是C++的操作符,malloc/free是C/C++的标准库函数。

2.new申请的可以理解为对象,new时会调用构造函数,返回指向该对象的指针,delete时调用析构函数;malloc申请的只是内存,不是对象。

3.new/delete是保留字,不需要头文件支持;malloc/free需要头文件库函数支持。

注意事项

1.用new申请的内存,必须用delete释放。

2.用new[]申请的内存,必须用delete[]释放。

3.delete释放内存后,指针值不变,良好的风格是释放后指针置为NULL,如,delete p; p = NULL。

4.用malloc申请的内存,必须用free释放。

使用

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include "stdlib.h"
  4. #include <string.h>
  5. struct Stu
  6. {
  7. char name[32];
  8. int age;
  9. };
  10. int main()
  11. {
  12. /**************************** 基本用法 **********************************/
  13. //申请一个int类型
  14. int *p1 = new int; //直接申请赋值 int* p1 = new int(3);
  15. int *p2 = (int*)malloc(sizeof(int));
  16. //申请一个char类型
  17. char *p3 = new char; //直接申请赋值 char *p3 = new char('c');
  18. char *p4 = (char*)malloc(sizeof(char));
  19. //申请一个int型一维数组
  20. int *p5 = new int[5]; //直接申请赋值 int *p5 = new int[5]{1,2,3,4,5};
  21. int *p6 = (int*)malloc(sizeof(int)*5);
  22. //申请一个char型一维数组
  23. char* p7 = new char[6]; //直接申请赋值 char* p7 = new char[3]{'a', 'v', 'c'};
  24. char* p8 = (char*)malloc(sizeof(char)*6);
  25. //申请一个int型二维数组
  26. int(*p9)[2] = new int[2][2]; //直接申请赋值 int(*p9)[2] = new int[2][2]{ 1,2,3,4 };
  27. int(*p10)[2] = (int(*)[2])malloc(sizeof(int)*2*2);
  28. //申请一个char型二维数组
  29. char(*p11)[2] = new char[2][2];
  30. char(*p12)[2] = (char(*)[2])malloc(sizeof(char)*2*2);
  31. /***************************** 申请二级指针内存 **********************************/
  32. //申请二级指针(new,delete)
  33. char** p13 = new char*[2];
  34. p13[0] = "aaaaaaaaaa";
  35. p13[1] = "vvvvvvvvvv";
  36. delete p13;
  37. //申请二级指针(malloc, free)
  38. char** p14 = (char**)malloc(sizeof(char*)*2);
  39. p14[0] = "cccccccc";
  40. p14[1] = "dddddddd";
  41. delete p14;
  42. /****************************** 申请结构体内存 *********************************/
  43. //new delete
  44. Stu* pStu1 = new Stu;
  45. Stu* pStu2 = new Stu{"wpf", 10};
  46. Stu* pStu3 = new Stu[1024];
  47. delete pStu1;
  48. delete pStu2;
  49. delete[] pStu3;
  50. //malloc free
  51. Stu* pStu4 = (Stu*)malloc(sizeof(Stu));
  52. memset(pStu4, 0, sizeof(Stu));
  53. free(pStu4);
  54. getchar();
  55. }

欢迎加群交流:C/C++开发交流

malloc/free和new/delete详解与应用的更多相关文章

  1. C++ 内存分配操作符new和delete详解

    重载new和delete 首先借用C++ Primer 5e的一个例子: string *sp = new string("a value"); ]; 这其实进行了以下三步操作: ...

  2. C++ new/delete详解及原理

    学了冯诺依曼体系结构,我们知道: 硬件决定软件行为,数据都是围绕内存流动的. 可想而知,内存是多么重要.当然,我们这里说的内存是虚拟内存(详情看Linxu壹之型). 1.C/C++内存布局 2.C语言 ...

  3. OAF_EO系列6 - Delete详解和实现(案例)

    2014-06-14 Created By BaoXinjian

  4. RMAN主要命令 show,list,crosscheck,delete详解

    Oracle RMAN 的 show,list,crosscheck,delete命令整理  Oracle RMAN 的 show,list,crosscheck,delete命令整理 1.SHOW命 ...

  5. 动态内存管理详解:malloc/free/new/delete/brk/mmap

    c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...

  6. new、delete与malloc、free的详解

    内容清单: 1.  C语言中的函数malloc和free 2.  C++中的运算符new和delete 3.  new/delete与malloc/free之间的联系和区别 4.  C/C++程序的内 ...

  7. C++之new/delete/malloc/free详解

    主要内容: 1.  C语言中的函数malloc和free 2.  C++中的运算符new和delete 3.  new/delete与malloc/free之间的联系和区别 4.  C/C++程序的内 ...

  8. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  9. 原生JS:delete、in、typeof、instanceof、void详解

    delete.in.typeof.instanceof.void详解 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/doc ...

随机推荐

  1. (转) hive调优(2)

    hive 调优(二)参数调优汇总 在hive调优(一) 中说了一些常见的调优,但是觉得参数涉及不多,补充如下 1.设置合理solt数 mapred.tasktracker.map.tasks.maxi ...

  2. ssh刚连接到其他服务器就闪退的问题。Connection to slave1 closed

    问题现象: 由于最近在docker上部署hadoop,最开始搭建完以后,ssh是正常的,当我重启系统以后就出现了上面的这个问题 解决: 修改配置文件:/etc/ssh/sshd_config 把Per ...

  3. uni-app和php交互DES加密解密数据

    1 uni-app操作 (1) 打开HBuilderX的视图->显示终端 cd 切换到你项目的根目录 执行命令 npm install crypto-js 安装成功后你的项目根目录会生成node ...

  4. 【零基础】神经网络优化之Adam

    一.序言 Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所以 ...

  5. 对象转型、迭代器Iterator、Set集合、装箱与拆箱、基本数据类型与字符串的转换、TreeSet集合与对象

      包的声明与定义 需要注意的是,包的声明只能位于Java源文件的第一行. 在实际程序开发过程中,定义的类都是含有包名的: 如果没有显式地声明package语句,创建的类则处于默认包下: 在实际开发中 ...

  6. js的一些兼容性易错的的问题

    一.属性相关 我们通常把特征(attribute)和属性(property)统称为属性,但是他们确实是不同的概念,特征(attribute)会表现在HTML文本中,对特征的修改一定会表现在元素的out ...

  7. qt sql 数据库操作

    1.  连接数据库 mysql连接: QSqlDatabase mysql_db=QSqlDatabase::addDatabase("QMYSQL","mysql_co ...

  8. docker tcp配置

    1. Ubuntu Docker deamon监听tcp端口设置 https://www.jianshu.com/p/e278b0e44e1b 2. Centos https://www.cnblog ...

  9. GIS 空间分析案例分析-错误排除经验总结

    GIS 空间分析案例分析-错误排除经验总结 商务科技合作:向日葵,135—4855__4328,xiexiaokui#qq.com 目录:问题发现,问题分析,解决方法,结果 1. problem di ...

  10. win10下安装Kafka

    去kafka官网(http://kafka.apache.org/downloads.html)下最新包(目前是2.3.0),不分操作系统,直接点二进制压缩包链接跳过去下载即可 -> 解压到你指 ...