C++ 动态存储空间的分配和释放 new与malloc的区别
使用new申请空间:
特点:
1、没有名字,只能通过指针间接访问它们。
2、从堆中申请空间
分类:
变量:
语法:指针变量 = new 类型名;
Delete 指针变量
举例:int *p;
p=new int;
delete p;
初始化:
*p=90;
p=new int(99);
一维数组:
语法:指针变量 = new 类型名[下标表达式];
下标表达式是整型常量或整型表达式
Delete
[ ]指针变量;---[ ]表明是个数组,但不需要指出其大小
举例:Int *p;
P= new type[s];
Delete [ ]p;
多维数组(二维数组): 必须指出所有维的长度
语法:指针变量 = new 类型名[下标表达式] [下标表达式];
Delete [ ]变量名
举例:定义一个3×4的数组
Int (*p)[]; p是个指针,它指向一个n维数组(4定义的时候必须已知,即后几维必须已知)
p=new int[3][4];// 第一维可以是常量或表达式,其他维必须全部为常量
Delete [ ]p;
对象:可以在创建对象的时候同时进行初始化
语法: 类名 *指针变量 = new 类名(实参表);
对象数组:
语法:类名 数组名[元素个数];
或: 类名* 指针名;指针名=new 类名[数组长度];
举例:Point A[2];
Point* p;
*p=new Point[5];
delete [ ]p;
初始化:每个对象都要调用一次构造函数和一次析构函数。
1)对象数组确定且长度有限:可以使用参数列表初始化
Point A[2]={Point(1,2),Point(3,4)};
2)对象数组长度比较大或不确定:只能调用无参或者使用缺省参数的函数
Point A[2];
原因:在建立对象数组的时候,C++不允许整体对对象进行初始化(即[ ]和( )不能一起使用),这时不能给对象 使用有参数的构造函数
所以:创建一个类的对象数组,就对给类的构造函数有要求:对象数组只能调用一个不需要参数的构造函数
常见问题:
1):有了malloc/free 为什么还要new/delete?
malloc/free 只能满足内部数据类型的变量,它们只需要申请空间,无法对空间进行操作
而对于非内部数据类型的对象来说,对象在创建的同时要自动执行构造函数,在消亡之前要自动执行析构函数。
由于malloc/free
是库函数而不是运算符,不在编译器控制权限之内,不能够自动地调用构造函数和析构函数。即用无法满足动态对象的要求。
因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
注意new/delete 不是库函数,而是运算符。malloc/free 是标准库函数。
2):malloc/free 和 new/delete 的相同点和不同点
相同点:它们都可以申请和释放空间。
不同点:
一、new :分配内存 + 调用类的构造函数 + 初始化 delete:释放内存 + 调用类的析构函数
malloc:只分配内存,不会进行初始化类成员的工作 free只释放内存,不会调用析构函数
二、new delete 是运算符,可以进行重载
malloc,free是函数,不可以进行重载
三、new delete 更加安全,简单:
不用计算类型大小:自动计算要分配存储区的字节数
不用强制类型转换:自动返回正确的指针类型
四、new可以分配一个对象或对象数组的存储空间,malloc不可以
五、可以超载与类相关的new和delete
六、malloc/free 是标准库函数,new/delete是C++运算符
2):new和delete搭配使用,malloc和free搭配使用:混搭可能出现不可预料的错误
3):new后执行的三个操作:(某面试题目)
1、new的类分配内存空间。
2、 调用类的构造方法。
3 、返回该实例(对象)的内存地址
C++ 动态存储空间的分配和释放 new与malloc的区别的更多相关文章
- 如何在MD(d)和MT(d)工程间正确分配和释放动态内存
MD(d)和MT(d) MD(d)和MT(d)是windows下VC开发的两个编译选项,表示程序的运行时库编译选项. /MT是"multithread, static version&quo ...
- C/C++动态二维数组的内存分配和释放
C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料 ...
- C语言动态内存的申请和释放
什么是动态内存的申请和释放? 当程序运行到需要一个动态分配的变量时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量.当不再使用该变量时,也就是它的生命结束时,要显式释放它所占用的存储空 ...
- C++学习011-常用内存分配及释放函数
C++用有多种方法来分配及释放内存,下面是一些经常使用的内存分配及释放函数 现在我还是一个技术小白,一般用到也指示 new+delete 和 malloc和free 其他的也是在学习中看到,下面的文字 ...
- 【转】c语言动态与静态分配
https://blog.csdn.net/qq_43519310/article/details/85274836 https://blog.csdn.net/qq_38906523/article ...
- Delphi的分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同
转载自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool 我估摸着内存分配+释放是个基础的函数,有些人可能没注意此类函数或细 ...
- C语言中的内存分配与释放
C语言中的内存分配与释放 对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容 ...
- C++内存分配与释放
C++内存分配与释放 1. new 运算符 与 operator new一条 new 表达式语句( new Type; )中的 new 是指 new 运算符.operator new 是定义在 #in ...
随机推荐
- 使用nginx实现浏览器跨域请求
跨域访问问题, 相信很多人都遇到过, 并且都用不同的办法去解决过. 方法有很多种, 不一一叙述了. 这里主要使用nginx反向代理来解决跨域问题. 啥是跨域? 假如你是百度开发人员, 在百度页面去请求 ...
- java linux ftp问题
java写的ftp上传类,本地测试环境可以用,阿里云服务器不可用,两者系统均为centos.经过测试,发现appche的ftpclient类不可用,换成sun的ftpclient可以使用.
- SonarQube代码质量管理工具的升级(sonarqube6.2 + sonar-scanner-2.8 + MySQL5.6+)
SonarQube升级注意事项 0. 前提条件 如果之前是使用sonarqube5.2 + sonar-runner-2.4 +MySQL5.5版本或者类似的组合. 安装方法请参照SonarQube代 ...
- STM32应用实例八:与多台MS5803压力传感器I2C通讯
MS5803压力传感器支持SPI和I2C总线通讯,拥有24位AD转换.能够同时获得压力值和温度值,其中压力测量范围为10-1100mbar,温度的测量范围是-40-85摄氏度.各引脚功能及参数如下: ...
- laravel 接口跨域
最方便的方法,新建一个middleWare,把这个middleware加入到全局中间件,所有的请求,都会经过这个中间件的过滤. php artisan make:middleware CrossHtt ...
- 目标检测-yolo
论文下载:http://arxiv.org/abs/1506.02640 代码下载:https://github.com/pjreddie/darknet 1.创新点 端到端训练及推断 + 改革区域建 ...
- SQLite Manager插件安装与使用(firefox)
下载与安装: FireFox 插件:SQLite Manager可以管理你电脑上的任何 SQLite数据库.一个直观的目录树状来展示数据库的对象.通过提示对话来管理表.索引.视图和触发器.你能浏览和搜 ...
- python 全栈开发,Day89(sorted面试题,Pycharm配置支持vue语法,Vue基础语法,小清单练习)
一.sorted面试题 面试题: [11, 33, 4, 2, 11, 4, 9, 2] 去重并保持原来的顺序 答案1: list1 = [11, 33, 4, 2, 11, 4, 9, 2] ret ...
- spring-boot集成spring-data-jpa
参考这个就行, http://blog.csdn.net/wazz753/article/details/72472411 ps:集成过程中pom文件,我加入的内容如下,两个都需要,实体类记得加注解和 ...
- 关于jsp页面到页面传值
很久没用这种传值了,一般都是一个.do请求到后台在跳转到前端:像有些只是展示数据功能,这样做就显得没有必要,闲话不说了,记录下来供下次参考. 用的是html的a标签,我这里只用这2种用法. 场景如下图 ...