使用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的区别的更多相关文章

  1. 如何在MD(d)和MT(d)工程间正确分配和释放动态内存

    MD(d)和MT(d) MD(d)和MT(d)是windows下VC开发的两个编译选项,表示程序的运行时库编译选项. /MT是"multithread, static version&quo ...

  2. C/C++动态二维数组的内存分配和释放

    C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...

  3. 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现

    http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料 ...

  4. C语言动态内存的申请和释放

    什么是动态内存的申请和释放? 当程序运行到需要一个动态分配的变量时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量.当不再使用该变量时,也就是它的生命结束时,要显式释放它所占用的存储空 ...

  5. C++学习011-常用内存分配及释放函数

    C++用有多种方法来分配及释放内存,下面是一些经常使用的内存分配及释放函数 现在我还是一个技术小白,一般用到也指示 new+delete 和 malloc和free 其他的也是在学习中看到,下面的文字 ...

  6. 【转】c语言动态与静态分配

    https://blog.csdn.net/qq_43519310/article/details/85274836 https://blog.csdn.net/qq_38906523/article ...

  7. Delphi的分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同

    转载自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool 我估摸着内存分配+释放是个基础的函数,有些人可能没注意此类函数或细 ...

  8. C语言中的内存分配与释放

    C语言中的内存分配与释放 对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容 ...

  9. C++内存分配与释放

    C++内存分配与释放 1. new 运算符 与 operator new一条 new 表达式语句( new Type; )中的 new 是指 new 运算符.operator new 是定义在 #in ...

随机推荐

  1. grep用法【转】

    简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...

  2. C# 关于用7zip压缩文件提示win32exception 系统找不到文件解决方案(win7 x64)

    网上已经很多这方面的资料了,我就简单的说下好了 为了方便以后的查看 --------------------- 1.需要下载7zSharp:http://7zsharp.codeplex.com/re ...

  3. 连接Linux服务器操作Oracle数据库

    连接Linux服务器操作Oracle数据库   由于项目已经上线,现场的数据库服务器不允许直接用Oracle的客户端plsqldev.exe来连接,只能通过Linux服务器的命令来操作. 以下是用Se ...

  4. 通达OA数据库优化方案之_历史数据清理

    整体思路: 1.备份现有系统数据,提供一个可以查询历史的入口(可以查询2015年6月份以前的所有OA产生的流程) 2.删除生产环境中2015年6月份以前的流程 为避免影响考勤,暂定在本月考勤定稿后实施 ...

  5. SonarQube代码质量管理工具安装与使用(sonarqube5.1.2 + sonar-runner-dist-2.4 + MySQL5.x)

    1. SonarQube安装(sonarqube5.1.2 + sonar-runner-dist-2.4) 1.1 前提条件 1) 已安装Java环境(version:1.7+) 2) 已安装MyS ...

  6. Python-CSS入门

    一.架构分析 页面 => div的层级结构 => 具有采用哪些功能标签显示内容 结构层 > 位置层(布局层) > 内容层 二.css引入 - 行间式 <!-- 简单直接, ...

  7. Oracle常用sql语句(一)

    # Sql的分类 # DDL (Data Definition Language):数据定义语言,用来定义数据库对象:库.表.列等: CREATE. ALTER.DROP DML(Data Manip ...

  8. C#中Convert.ToInt32、int.TryParse、(int)和int.Parse四者的区别

    Convert.ToInt32.(int)和int.Parse三者的区别: 首先:Convert.ToInt32 适合将object类类型转换成int类型,如Convert.ToInt32(sessi ...

  9. NodeJs>------->>第二章:Node.js中交互式运行环境--------REL

    第二章:Node.js中交互式运行环境--------REL 一:REPL运行环境概述 C:\Users\junliu>node > foo = 'bar' ; 'bar' > 二: ...

  10. python之比较is与==(转载)

    在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同.莱布尼茨说过: ...