1.new_delete与malloc_free

❶malloc/free:

malloc原型: void *malloc(long NumBytes)

该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。申请了内存空间后,必须检查是否分配成功。

free原型:void free(void *FirstByte):

该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

❷二者区别在于

⑴ malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符

⑵ new能够自动分配空间大小,malloc需要计算大小作为传入参数。但是,2者都是从堆中获得内存。

new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。实际上,malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。而new 内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。

内存分配失败,处理机制不同。

malloc分配失败时,返回NULL。因此必须要人工检查是否分配成功

 new分配失败时,抛出std::bad_alloc异常。可以在new的入口点采用了nothrow对象避免跑出而返回0:

   class widget   {   ...   };
widget *pw1=new widget;//分配失败抛出std::bad_alloc
if(pw1== 0) ... // 这个检查一定失败
widget* pw2= new (nothrow) widget;//若分配失败返回0
if(pw2==0) ... //这个检查可能会成功

❸new和malloc的用法:

int *p = (int *) malloc(sizeof(int) * length); 

Obj *objects = new Obj[100](1);// 创建100 个动态对象的同时赋初值1
string *ps=new string(10,’9’);//*ps 为“9999999999”
int *pi=new int(100); //指针pi所指向的对象初始化为100

2.realloc重新分配内存机制

      extern void *realloc(void *mem_address, unsigned int newsize)//注意newsize并非是需要增加相对的大小,而是总的大小

原理

先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。也需要人工检查是否分配失败。

   例如:

对于一个2*4的数组,要扩容至为3*5的数组。

#include<iostream>
using namespace std; //数组显示
void show(int p[],int n){
for(int i=0;i<n;i++)
cout<<p[i]<<" ";
cout<<endl;
}
void main(){ //初始大小2*4
int** p=new int*[2];
p[0]=new int[4];
p[1]=new int[4];
for(int i=0;i<4;i++){
p[0][i]=i;
p[1][i]=i+4;
}
show(p[0],4);show(p[1],4); //重新分配,扩容至3*5
p=(int**)realloc(p,3*sizeof(int*));
p[0]=(int*)realloc(p[0],5*sizeof(int));
p[1]=(int*)realloc(p[1],5*sizeof(int));
p[2]=(int*)malloc(5*sizeof(int)); //数组赋值
if(!p&&!p[0]&&!p[1]&&!p[2]){
p[0][4]=8;
p[1][4]=9; for(int i=0;i<5;i++)
p[2][i]=i+10;
} show(p[0],5);show(p[1],5);show(p[2],5); for(int i=0;i<3;i++)
delete[]p[i];
delete []p;
}

参考:

1.new和malloc的区别

new与delete,malloc与free的更多相关文章

  1. 深入C++ new/delete,malloc/free解析

    深入C++ new/delete,malloc/free解析 1.malloc与free是C++/C语言的标准库函数.new/delete是C++的运算符. 它们都可用于申请动态内存和释放内存 2.对 ...

  2. C++ new delete malloc free

    title: C++ new delete malloc free date: 2020-03-10 categories: c++ tags: 语法 C++的new delete malloc fr ...

  3. new和delete malloc和free

    程序中动态分配的对象存放在自由存储区(free store)或堆(heap). C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达 ...

  4. new,delete,malloc,free

    malloc/free是C语言中的内存申请和释放函数,利用它们可方便地管理内存.而在C++中我们又有了新的工具:new/delete.new/delete在管理内存的同时会调用类的构造函数和析构函数, ...

  5. 内存分配方式,堆区,栈区,new/delete/malloc/free

    1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...

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

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

  7. C++/C语言的标准库函数与运算符的区别new/delete malloc/free

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...

  8. 内存分配(new/delete,malloc/free,allocator,内存池)

    以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...

  9. C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free

    内存分配方式 内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函 ...

  10. 动态内存的分配(new delete malloc free)

    new和malloc的区别是什么?-new关键字是C++的一部分,在所有的C++编译器中都被支持-malloc是由C库提供的函数,在某些系统开发中是不能调用的-new以具体类型为单位进行内存分配-ma ...

随机推荐

  1. 微信支付:微信支付遇到的坑:jssdk,phpdemo,微信支付提示{"errMsg":"chooseWXPay:fail"}

    微信支付:微信支付遇到的坑:jssdk,phpdemo 使用微信支付,真是变态,如果不是微信用户多,我才不适配微信支付,我就在想:为什么没人用我支付宝的[点点虫]呢.一个小小的“/”的误差,都调不起微 ...

  2. javascript 跨域问题解决办法总结

    跨域的意思就是不同域名之间的页面默认是无法通信的.因为浏览器默认是禁止跨域的: 图所示:chrome浏览器尝试获取mainFrame失败,提示DomException 1).假如你有个网站 a.com ...

  3. HDU 1711 kmp+离散化

    http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/Other ...

  4. IaaS中的统一存储:从设计到实现

    转自:https://www.ustack.com/blog/tycc/ “原生的OpenStack并不支持统一存储,云主机服务Nova.镜像服务Glance.云硬盘服务Cinder的后端存储各不相同 ...

  5. Linux_总结_02_最小化安装后需要安装和更新的命令

    一.前言 二.安装命令 1.配置yum源 2.更新yum sudo yum -y update 3.安装ifconfig 最小化安装后,是无法使用ifconfig命令的. 可参见:CentOS7下解决 ...

  6. 条款50:使用自定义的new以及delete的时机会

    几种最常见的这么做的理由:     1.用来检测运行上的错误:可以在分配的内存空间的起始以及结束分别放置单独的签名     2.为了强化性能     3.为了收集使用上的统计数据 按照第一点就可以举一 ...

  7. 20165210 Java第三周学习总结

    20165210 Java第三周学习总结 教材学习内容总结 - 第四章学习总结 编程语言的几个发展阶段: 面向机器语言 面向过程语言 面向对象语言 类: 类声明: class People { ... ...

  8. BEC listen and translation exercise 7

    Maybe I ought to subscribe to the Engineering Quarterly.也许我应该订阅<工程学季刊>. The performance is sai ...

  9. grep搜索子目录中包含某字符串的特定文件

    grep -n "str" -r ./ 这是查找当前目录下以及下辖子目录下所有包含str字符串的文件,会列出文件名.以及该行的内容.以及行号 比如,我想搜源码目录src下,包含“n ...

  10. pip镜像源

    pip是用国内镜像源 https://pypi.python.org/http://pypi.douban.com/simple/ http://mirrors.aliyun.com/pypi/sim ...