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 ...
随机推荐
- ThreadPool(线程池)
WPF使用ThreadPool.QueueUserWorkItem线程池防界面假死 时间:2012-01-09 20:44来源:http://luacloud.com 作者:luacloud 点击:1 ...
- iis 设置 主机头,设置 host文件
iis主机头设置后,一般本机不能再用ip:127.0.0.1访问. 接着设置host文件,使用域名直接访问主机头就可以访问到127.0.0.1 host文件路径:c//system32/drives/ ...
- 算法练习1---桶排序java版
今天复习了桶排序. 例如现在有满分为10分的试卷,学生得分分别为2,8,5,3,5,7,现在要给这些分数按照从大到小输出,使用桶排序的思想:有11个桶,每个桶有一个编号,编号从0-10,每出现一个分数 ...
- 使用Fluentd + MongoDB构建实时日志收集系统
Fluentd是一个日志收集系统,它的特点在于其各部分均是可定制化的,你可以通过简单的配置,将日志收集到不同的地方. 目前开源社区已经贡献了下面一些存储插件:MongoDB, Redis, Couch ...
- LSTM与Highway-LSTM算法实现的研究概述
LSTM与Highway-LSTM算法实现的研究概述 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2015-12-22 ...
- linux 下安装rar解压
在liunx下原本是不支持rar文件的,需要安装liunx下的winrar版本,操作如下 wget http://www.rarsoft.com/rar/rarlinux-4.0.1.tar.gz t ...
- Git和Github使用说明
1. 安装 官网地址:https://git-scm.com/downloads 我这里使用的是git version 2.19.1.windows.1,全程傻瓜式安装,点下一步即可,可以把命令模式和 ...
- UML类图与类的关系详解【转】
在画类图的时候,理清类和类之间的关系是重点. 类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分 ...
- Oracle记录(一)Oracle简介与安装
Oracle笔记(一) Oracle简介及安装 一.轨迹 二.Oracle简介 Oracle是现在全世界最大的数据库提供商,编程语言提供商,应用软件提供商,它的地位等价于微软的地位. Oracle在古 ...
- 编译PHP扩展的通用方法
以安装swoole扩展为例: 步骤1: wget pecl.php.net/get/swoole-1.7.21.tgz (下载swoole打包文件) 步骤2: tar zxvf swoole-1. ...