C语言中使用malloc/calloc/realloc用来在堆上分配空间,free将申请的空间释放掉。

malloc:

原型:extern void *malloc(unsigned int num_bytes)。

功能:分配长度为num_bytes字节的内存块。

1     int *p=(int*)malloc(sizeof(int));
2     free(p);
3     p=NULL

calloc:

原型:extern void *calloc(int num_elems, int elem_size);

用法:#include <alloc.h>

功能:为具有num_elems个长度为elem_size元素的数组分配内存

1     int *p=(int*)calloc(100,sizeof(int));
2     free(p);
3     p=NULL;

realloc:

原型:extern void *realloc(void *mem_address, unsigned int newsize);

用法:#include <alloc.h>

功能:改变mem_address所指内存区域的大小为newsize长度。

1     int *p=(int*)malloc(sizeof(int));
2     realloc(p,10*sizeof(int));
3     free(p);

问题:为什么分配了空间之后,必须要用户手动去free掉呢?

答案:因为malloc/calloc/realloc都是在堆上分配的,堆上分配的空间必须由用户自己来管理,如果不释放,就会造成内存泄漏。而栈上分配的空间是由编译器来管理的,具有函数作用域,出了函数作用域后系统会自动回收,不由用户管理,所以不用用户显式释放空间。

C++中是通过new和delete操作符进行动态内存管理的。因为new和delete是操作符,所以可以重载。

用一张图说明new和delete的含义:

new和delete以及malloc和free一样,要成对使用。

这是string *s = new string("a value"); 这句表达式内部的实现:

可以得出

(初始化一个对象时)new内部的调用顺序:new —— operator new —— malloc —— 构造函数 (先申请空间,再调用构造函数)

(初始化若干个对象时)new内部的调用顺序:new —— operator new [ ] —— operator new —— malloc —— 构造函数

(delete单个对象时)delete对象时,调用顺序为:delete —— 析构函数 —— operator delete —— free (先调用析构函数,再释放空间)

(delete多个对象时)delete对象时,调用顺序为:delete [ ] —— 析构函数 —— operator delete —— free

问题:new和delete与malloc和free都是存在堆上的,二者有什么差别?

答案

1. 它们都是动态管理内存的入口。

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

3. malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造析构函数进行初始化与清理(清理成员)。

4. malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型的大小对应类型的指针。

5.new/delete的底层调用了malloc/free。

6.malloc/free申请空间后得判空,new/delete则不需要。

7.new直接跟类型,malloc跟字节数个数。

转载于:https://www.cnblogs.com/WindSun/p/10419299.html

new/delete与malloc/free相关推荐

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

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

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

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

  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相关问题:区别?注意事项?使用方式?

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

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

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

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

    一.基本概念  malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则 ...

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

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

最新文章

  1. 收藏 | 数据分析师最常用的10个机器学习算法!
  2. 学python用哪个软件-学python要准备什么软件-问答-阿里云开发者社区-阿里云
  3. PAT甲级1062 Talent and Virtue:[C++题解]结构体、哈希表
  4. 数据库相关子查询实例
  5. XHTML教会我的一些东西-1
  6. win10系统电脑wifi图标不见了的开启方法
  7. 信息学奥赛一本通C++语言——1029:计算浮点数相除的余
  8. BP神经网络(手写数字识别)
  9. 重新配对_Apple Watch配对失败的解决办法
  10. leetcode第一刷_ Flatten Binary Tree to Linked List
  11. ISL68124与PMBUS
  12. 周鸿祎——互联网业界的“搅局者”
  13. html5毕业设计程序,网页毕业设计制作流程
  14. C++11新特性内存模型总结详解--一篇秒懂
  15. android渠道 积分墙,安卓推广:既然能在应用商店做CPD,为什么还一定要做积分墙?...
  16. 实验吧web天网管理系统
  17. 深度技术GHOST WIN7 SP1 装机旗舰版 2013 07
  18. java ssi_java SSI idea
  19. Loadrunner之关联——用小故事理解
  20. python获取股票数据接口

热门文章

  1. 深入理解移动前端开发之viewport
  2. docker php composer 使用_如何使用Docker部署PHP开发环境
  3. 当输入www.baidu.com会发生什么
  4. Spring中抛出异常时,既要要返回错误信息,还要做事务回滚
  5. 简单的一个月之设计实现内容1
  6. mysql string types ---- mysql 字符类型详解
  7. 一步一步学Remoting系列文章
  8. 在虚拟机中安装和配配置 MOSS2007 全过程
  9. BeanUtil使用例子:解析并转化HttpServletRequest到Bean的全面测试
  10. 中兴通讯 基于定位的技术和市场分析