new/delete与malloc/free
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相关推荐
- ZZ:new/delete 和malloc/free 的区别
相同点:都可用于申请动态内存和释放内存 不同点: (1)操作对象有所不同. malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光 ...
- new/delete与malloc/free的区别与联系详解
本博客主要说明new/delete,malloc/free的区别与联系,如下: 1.malloc/free为C的标准库函数,函数原型为: void* malloc(size_t size)//参数代表 ...
- new/delete与malloc/free的区别和联系
1.new 是c++中的操作符,malloc是c 中的一个函数 2.new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员 ...
- new/delete和malloc/free的区别
还是先说说区别吧: 1. new/delete是C++里才有的,而new/delete与malloc/free一个显著的区别在于,new是建造一个对象,并调用对象的构造函数来初始化对象,其实在 ...
- new/delete和malloc/free的区别(举例说明)(简单点)
先说说区别: 1. new/delete是C++里才有的. 2. new/delete通常来说是操作符,就是"+","-"一样. 3. new/delete是可 ...
- 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?
目录 一.内存分配模型 1.1 先看内存的分布状况 1.2 动态内存分配 1.3 C语言中分配内存的方式 1.4 C++中动态分配内存的方式 二.new和malloc的区别 2.1 属性 2.2 参数 ...
- new / delete与malloc / free的异同及实现原理
文章目录 前言 一.new和delete是如何实现的? 二.new/delete和malloc/free的区别 三.delete p.delete [] p.allocator都有什么作用? 四.de ...
- new/delete和malloc/free的区别一般汇总
一.基本概念 malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则 ...
- new、delete与malloc、free的详解
内容清单: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内 ...
最新文章
- 收藏 | 数据分析师最常用的10个机器学习算法!
- 学python用哪个软件-学python要准备什么软件-问答-阿里云开发者社区-阿里云
- PAT甲级1062 Talent and Virtue:[C++题解]结构体、哈希表
- 数据库相关子查询实例
- XHTML教会我的一些东西-1
- win10系统电脑wifi图标不见了的开启方法
- 信息学奥赛一本通C++语言——1029:计算浮点数相除的余
- BP神经网络(手写数字识别)
- 重新配对_Apple Watch配对失败的解决办法
- leetcode第一刷_ Flatten Binary Tree to Linked List
- ISL68124与PMBUS
- 周鸿祎——互联网业界的“搅局者”
- html5毕业设计程序,网页毕业设计制作流程
- C++11新特性内存模型总结详解--一篇秒懂
- android渠道 积分墙,安卓推广:既然能在应用商店做CPD,为什么还一定要做积分墙?...
- 实验吧web天网管理系统
- 深度技术GHOST WIN7 SP1 装机旗舰版 2013 07
- java ssi_java SSI idea
- Loadrunner之关联——用小故事理解
- python获取股票数据接口