malloc与new的区别
1. malloc()函数
1.1 malloc的全称是memory allocation,中文叫动态内存分配。
原型:extern void *malloc(unsigned int num_bytes);
说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
1.2 void *malloc(int size);
说明:malloc 向系统申请分配指定size个字节的内存空间,返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
备注:void* 表示未确定类型的指针,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)
1.3 free
void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
2. malloc和new的区别
2.1 new 返回指定类型的指针,并且可以自动计算所需要大小。
比如:
1) int *p;
p = new int; //返回类型为int* 类型(整数型指针),分配大小为sizeof(int);
或:
int* parr;
parr = new int[100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;
2) 而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *)malloc (sizeof(int)*128);//分配128个(可根据实际需要替换该数值)整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double*pd=(double *) malloc (sizeof(double)*12);//分配12个double型存储单元,并将首地址存储到指针变量pd中
举个例子:
Malloc版本:
char*str1,*str2;
str1=(char*)malloc(128);
str2=(char *)malloc(128);// 分配128个字符存储单
//元,并将这128个连续的字符存储单元的首地址存储到指针变量str1中
free(str1);
free(str2);
new ,delete版本:
char *str1, *str2;
str1= new char[128];
str2 = newchar[128];
delete[]str1;
delete[] str2;
2.2 malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
3.有了malloc/free为什么还要new/delete?
1) malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2) 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
3) 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
3.有了malloc/free为什么还要new/delete?
1) malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2) 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
3) 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
malloc与new的区别相关推荐
- 转载:malloc()与new()的区别详解
1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void *malloc(unsigned int num_byt ...
- Linux内存管理之kmalloc、malloc、vmalloc的区别
Linux内存管理之kmalloc.malloc.vmalloc的区别 kmalloc和vmalloc分配的是内核空间的内存,malloc分配的是用户空间的内存. kmalloc保证分配的内存在物理上 ...
- malloc和new的区别
鉴于上次腾讯一面涉及到了malloc/free和new/delete的区别,当时我回答的不够全面,在网上搜了搜,找到了一篇介绍得比较全面的文章,先将其转载至我的博客上,以供自己和大家一起学习,链接为: ...
- malloc 和 calloc的区别?
函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别.malloc()函数有一个参数,即要分配的内存空间的大小:void *malloc(size_t size);call ...
- malloc与calloc的区别
malloc()与calloc() C语言跟内存分配方式 1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. ...
- c++中new的总结(动态管理,malloc存在的问题,malloc与new的区别)
c中使用malloc出现的问题 程序员必须确定对象的长度 malloc 返回一个(void *)指针 ,c++不允许将(void*) 赋值给其它指针,必须强转 malloc可能申请内存失败,所以必须判 ...
- linux 内存管理之kmalloc、vmalloc、malloc、get_gree_pages的区别
简述: 1.kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存 2.kmalloc保证分配的内存在物理上是连续的,内存只有在要被DMA访问的时候才需要物理上连续,mal ...
- malloc,colloc,realloc的区别
1. malloc,只管分配,不初始化 void *malloc(size_t size); malloc()在内存的动态存储区中分配一块长度为size字节的连续区域.参数size为需要的内存空间的长 ...
- 别再说你不懂malloc()和calloc()的区别
1.参数个数上的区别 malloc函数:malloc(size_t size)函数有一个参数,即要分配的内存空间的大小. calloc函数:calloc(size_t numElements,size ...
最新文章
- java boolean几个字节_Java中boolean类型到底占用多少个字节?
- PHP动态验证,php-动态更改验证规则
- linux两个数字正则,正则表达式-Linux readelf显示具有不同数字系...
- 解决Ubuntu 9.04无线网络的不稳定问题-转
- 翻牌游戏如何打乱牌面java_如何游戏4Bet底池?
- flash遮罩弹性跟随效果
- 于的繁体字有几种写法_于的繁体字是什么(行书怎么写)
- 故事系列之二:佛法世界中看天赋与勤奋
- Spring Batch 中的 chunk
- sdnu oj 1228 Overwatch 互素
- 查询mysql的版本
- Jep解析字符串数学公式
- python中geometry用法_pythongdal教程之:几何形状geometry与投影projection
- 超有用的前端配色网站
- 关于 Symbol() 能不能当作 key值使用
- C#连接Kepserver OPC与PLC通讯程序源码教程
- 大数据架构师进阶之路-技术学习路线
- 实现财务自由的七大步骤
- 南京理工大学计算机科学与工程学院复试名单,南京理工大学计算机科学与工程学院2015考研复试及录取办法...
- [urlrewrite]使用urlrewrite进行地址自动重定向
热门文章
- 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践
- oc 中随机数的用法(arc4random() 、random()、CCRANDOM_0_1()
- 关于fflush、缓冲区、scanf、EOF等问题真麻烦
- JAVA基础--JAVA中的反射机制详解
- JQuery Attributes 方法说明
- Hive中文注释乱码解决方案
- 解决ubuntu命令行中文显示为问号的问题
- Redis系列五:redis键管理和redis数据库管理
- iOS 开发之 OOA (面向对象分析) OOD (面向对象设计) OOP (面向对象编程)
- Spring 学习总结 使用静态工厂创建Bean