c++中new的总结(动态管理,malloc存在的问题,malloc与new的区别)
c中使用malloc出现的问题
- 程序员必须确定对象的长度
- malloc 返回一个
(void *)
指针 ,c++不允许将(void*)
赋值给其它指针,必须强转 - malloc可能申请内存失败,所以必须判断返回值来保存内存分配成功
- 用户在使用对象之前必须记住对他初始化,构造函数不能显示调用初始化(构造函数是由编译器调用的),用户有可能忘记调用初始化函数
c的动态内存分配函数太复杂,容易令人混淆,是不可接受的,c++中我们推荐使用运算符new和delete
new运算符和delete运算符
Person *p=new Person
会返回一个Person默认调用析构函数,开辟空间,返回不是
void*
,不需要强制转换delete释放
new对象用
void *
取接受,释放不了对象new出来的是数组,如何释放 ? delete[]
new出来的是数组,肯定会调用默认构造
#include<iostream>using namespace std;class Person{public:Person(){cout << "默认构造函数调用" << endl;}Person(int a){cout << "有参构造调用" << endl;}~Person(){cout << "析构函数调用" << endl;}};void test01(){//Person p1; //栈区开辟Person *p2 = new Person;//堆区开辟//所有new出来的对象,都会返回该类型的指针//malloc返回void*还要强转//malloc会调用构造吗?不会 new会调用构造//new运算符,malloc是函数//释放堆区域的空间//delete也是运算符,要配合new用,malloc配合free用delete p2;}void test02(){void *p = new Person;//当用void* 接受new出来的指针,会出现释放的问题delete p;//无法释放p}void test03(){//同过new来开辟数组//一定会调用默认构造函数,所以一定要提供默认构造Person *pArray = new Person[10];//Person pArray2[2] = { Person(1), Person(2) };//在栈上开辟数组,可以指定有参构造//释放数组 delete[]必须加上中括号delete []pArray;}int main(){//test01();//test02();test03();system("pause");return 0;}
malloc/free和new/delete的区别
malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:
- malloc和free是函数,new和delete是操作符
- malloc申请的空间不会初始化,new可以初始化
- malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可
- malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
- malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
- 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间 后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理
- new/delete比malloc和free的效率稍微低点,因为new/delete的底层封装了malloc/free
c++中new的总结(动态管理,malloc存在的问题,malloc与new的区别)相关推荐
- Windows内存管理 - 隐藏在new和malloc背后的heap
先来说,heap是什么,heap就是堆,在不知道具体细节的时候,我们只知道,通过new和malloc,我们可以动态获得一个内存区域,用来存放自己的对象和变量,而这些内存区域都是在heap上的.heap ...
- 【C++初阶】:动态管理
动态管理 一.new和delete(一般使用) 二.operator new与operator delete函数(底层) 三.new和delete的实现原理 四.定位new(placement-new ...
- C++内存管理(4):malloc的秘密
这次我们深入了解malloc,malloc究竟分配多么大的空间,以及整个过程是如何进行的. malloc其实并没有想象中那么低效,在底层的设计中也是充满着精妙之处的. 以下分解内容以VC6版本为基础. ...
- 仓库货位卡标识牌_仓储管理中的货位与标识管理
在现实的仓储管理中,我们常常听说有发错料.发串料的情况发生.究其原因,我认为这其中难免有保管人员粗心大意的主观成分,而最主要的.客观的因素应该是货位与标识不清.打个比方,我们指定了一个仓管员去某个货位 ...
- SpringBoot 定时任务动态管理通用解决方案
欢迎关注方志朋的博客,回复"666"获面试宝典 一.功能说明 SpringBoot的定时任务的加强工具,实现对SpringBoot原生的定时任务进行动态管理,完全兼容原生@Sche ...
- quartz 动态添加job_SpringBoot+Quartz实现动态管理定时任务
前言: 最近在做Java开发对接微信公众平台之类的工作,在开发过程中遇到一个需求是定时任务这块的,但是普通的定时任务还远远不能满足:最后要实现的效果是每个任务都是不同的定时时间来执行而且是在前台页面上 ...
- 【Android 逆向】Android 中常用的 so 动态库 ( /system/lib/libc.so 动态库 | libc++.so 动态库 | libstdc++.so 动态库 )
文章目录 一.拷贝并分析 Android 中的 /system/lib/libc.so 动态库 二.拷贝并分析 Android 中的 /system/lib/libc++.so 动态库 三.拷贝并分析 ...
- 有什么办法动态更改yml的值吗_基于Redis实现Spring Cloud Gateway的动态管理
转载本文需注明出处:微信公众号EAWorld,违者必究. 引言: Spring Cloud Gateway是当前使用非常广泛的一种API网关.它本身能力并不能完全满足企业对网关的期望,人们希望它可以提 ...
- C和指针之动态内存分配malloc、calloc、realloc简单使用和区别
1.介绍 3个函数都在<stdlib.h>头文件 1).void* malloc(unsigned size); 在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需 ...
- envoy api 网关_在边缘,作为网关或在网格中构建控制平面以管理Envoy代理的指南...
envoy api 网关 最近, Envoy已成为流行的网络组件. 马特·克莱因( Matt Klein )在几年前写了一个博客,内容涉及Envoy的动态配置API,以及它如何成为Envoy的采用曲线 ...
最新文章
- 用c#开发微信 (16) 微活动 2 刮刮卡
- java c++ python哪个好_程序员学java好还是python语言好 c++又如何
- python在windows系统中安装pandas,numpy
- 32 岁大佬阿里二面,他答 JVM 题的姿势,令面试官很想不通。。。
- yum -y list java* 缓存加载不了_Java开发面试宝典:分布式相关篇
- linux如何删除行首的空格
- 数据库实验2:数据库的建立与维护
- 2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem H. Pair: normal and paranormal
- 拓端tecdat|R语言确定聚类的最佳簇数:3种聚类优化方法
- 看了IDC 2018 Q1存储报告,才知道宏杉科技为什么稳稳的
- leapftp怎么上传,小编教你leapftp怎么上传文件
- 一、mybatis-generator
- 解决主机和虚拟机相互ping通,但是虚拟机无法上网
- 一个人的武林:渗透测试常规思路分析(一)
- win10计算机出现位置不可用desktop不可用,桌面只有此电脑几个图标,其它桌面图标都没有了
- 梅西:世界杯是我最重要的奖杯;很高兴斯卡洛尼能够续约
- 想听世界上最懂 JavaScript 的人和你讲JavaScript 吗?
- 数学建模美赛O奖论文研读启示录——从模仿开始
- iis某狗注入绕过(get)
- c语言程序设计题模板,C语言程序设计试题集
热门文章
- Java中转发(Forward)和重定向(Redirect)的区别
- Dumb Bones UVA - 10529(概率dp)
- 201571030316/201571030314 《小学四则运算练习软件需求说明》结对项目报告
- Java开发高性能网站需要关注的事
- Randomize select algorithm 随机选择算法
- php 类静态变量 和 常量消耗内存及时间对比
- 猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息
- 大工20秋计算机组成原理在线作业2,大工14秋《计算机组成原理》在线作业2答案...
- python安装包找不到setup_如何安装没有setup.py的Python模块?
- java 转码%2f%_JS和JAVA中常用的编码转码函数