new与delete,malloc与free
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;
}
参考:
new与delete,malloc与free的更多相关文章
- 深入C++ new/delete,malloc/free解析
深入C++ new/delete,malloc/free解析 1.malloc与free是C++/C语言的标准库函数.new/delete是C++的运算符. 它们都可用于申请动态内存和释放内存 2.对 ...
- C++ new delete malloc free
title: C++ new delete malloc free date: 2020-03-10 categories: c++ tags: 语法 C++的new delete malloc fr ...
- new和delete malloc和free
程序中动态分配的对象存放在自由存储区(free store)或堆(heap). C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达 ...
- new,delete,malloc,free
malloc/free是C语言中的内存申请和释放函数,利用它们可方便地管理内存.而在C++中我们又有了新的工具:new/delete.new/delete在管理内存的同时会调用类的构造函数和析构函数, ...
- 内存分配方式,堆区,栈区,new/delete/malloc/free
1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...
- C++之new/delete/malloc/free详解
主要内容: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内 ...
- C++/C语言的标准库函数与运算符的区别new/delete malloc/free
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...
- 内存分配(new/delete,malloc/free,allocator,内存池)
以下来源http://www.cnblogs.com/JCSU/articles/1051826.html 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地 ...
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
内存分配方式 内存分配方式有三种: [1] 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量. [2] 在栈上创建.在执行函 ...
- 动态内存的分配(new delete malloc free)
new和malloc的区别是什么?-new关键字是C++的一部分,在所有的C++编译器中都被支持-malloc是由C库提供的函数,在某些系统开发中是不能调用的-new以具体类型为单位进行内存分配-ma ...
随机推荐
- 字符串(string+StringBuilder) +正则表达式元字符
创建字符串: System.String(string是这个类的别名) System.Text.StringBuilder System.String类: 1,创建字符串 string s = &qu ...
- php微信开发之带参数二维码的使用
最近做微信PC端网页微信相关功能的开发,从一个新手的角度来说,微信公众号的文档还是不好理解的,网上找的帖子大都也都基本上是复制微信公众平台上给的文档,开发微信带参数二维码过程中还是遇到不少坑的,在此把 ...
- Amazon EMR(Elastic MapReduce):亚马逊Hadoop托管服务运行架构&Hadoop云服务之战:微软vs.亚马逊
http://s3tools.org/s3cmd Amazon Elastic MapReduce (Amazon EMR)简介 Amazon Elastic MapReduce (Amazon EM ...
- 格式化SQL和逆格式SQL
上篇说过SQLyog中的计算合适数据类型的功能,现在说下Navicat格式化SQL和逆格式化SQL 啥也不说了,一看图,一目了然,Beautify SQL(格式化,即变成最美的语句)和Minify S ...
- 开发一个app需要多少钱
App应用开发是目前最热门的产业,很多企业都想通过app的开发来进入移动互联网市场分一杯羹. 那么你一定很想知道开发一个app需要多少钱吧?那下面企业帮就来帮大家计算一下费用吧. 面对app抄袭成风的 ...
- 经典SQL语句(转载)
一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...
- hadoop_异常_02_ExitCodeException exitCode=1: chmod: changing permissions of `/ray/hadoop/dfs/data': Operation not permitted
一.异常现象 启动hadoop时,datanode启动失败,出现如下异常: 2018-03-23 14:39:09,962 WARN org.apache.hadoop.hdfs.server.dat ...
- hdu4771 Stealing Harry Potter's Precious(DFS,BFS)
练习dfs和bfs的好题. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs ...
- SQL Server数据文件迁移
需求:源SQL Server安装目录及数据目录 与 目标SQL Server安装目录及数据目录 完全不同. 步骤: 1.拷贝源数据目录下需要移植的库文件(rpBrInfo_TA.mdf.rpBrInf ...
- Android Studio 开始运行错误
/******************************************************************************** * Android Studio 开 ...