- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第14讲
教学内容
6.3动态内存分配
6.3.1new运算和delete运算
教学重点和难点
1动态分配内存的概念和作用
2 new和delete的使用方法
教学方法:
通过讲解“数组定义时下标必须为常量”这个学生理解的知识点,来讲解动态内存分配的概念、作用。
通过程序演示,new和delete的使用方法。
教学学时
2 学时
教学过程
一动态分配内存的概念和作用:
1什么是动态内存分配?
动态内存分配是指在程序运行时向操作系统实时申请内存供程序使用。
允许为基本数据类型或者是自定义类型在程序中控制内存的分配与释放内存
用new和delete来实现。
2使用动态内存的目的:
使内存空间大小可以在运行时候确定
可以在不同的对象与函数之间共享
3如何使用动态内存分配?
1)动态分配的内存是在堆中分配的,在堆中分配的内存是没有名字,所以不能直接访问,只能间接访问,也就是只能通过指针变量来访问,这也就是指针变量最主要的用途
2)在堆中分配的内存,系统不能自动的申请和释放,所以要自己去申请和释放,而在栈中分配的内存,系统能自动的分配和回收
3)如何申请和释放呢?
申请:new
释放:delete
程序举例:思考下列程序错误的原因
void main(void)
{
int n;
cout 起请输入数组的长度endl;
cin n;
int a[n] = { 1,2,3,4,5};//错误!此时数组的空间需要在编译时候分配,而n的值在运行时候才有确定值,所以数组的长度要求为常量。
for( int i = 0 ; i n; i ++)
{
cout a[i] ;
}
}
二 new和delete的使用方法:
1 new运算符:
指针变量 = new 数据类型(初值);
new 将做三件事:
a)主动计算指定数据类型需要的内存空间大小,分配一个空间;
b)返回正确的指针类型;
c)在分配内存时,将按照语法规则,初始化所分配的内存。
2 delete运算符:
delete 指针P
功能:释放指针P所指向的内存。
程序演示:
例1:动态申请一个空间,这个空间存放int类型的数据
// 此时可以初始化,也可以不初始化
/*#include iostream.h
void main(void)
{
int *p;//1)首先有指针变量,才能间接访问
p = new int(60);
//2)把这个指针变量与动态的空间建立联系
//new int系统根据int在堆中分配四个字节,
//并返回首字节的地址
//3)通过 *来通过p间接的访问动态申请的内存
//*p = 50;
cout *p = *p endl;
delete p;//释放p所指向的内存
//有new就要有delete(有借有还)
//如果有new但是没有delete,结果不可预知
}
说明:如果程序中没有语句delete p,其结果也能运行,但是此时动态申请的这块空间就不能再被系统重新使用了(假如p又重新指向了另外的内存),这块内存就成了“孤立内存”了。
2 new 也可以动态分配数组,此时不能指定数组元素的初始值
注意:用new建立的数组,要用delete [] 来删除
动态分配数组不是动态数组,(dynamic array),这个数组本身不是动态的(不是自动的来调整大小来适应数据),因为一旦分配,数组的长度不会改变。
程序举例:
例2:动态申请一块连续的空间
//此时不能初始化
#include iostream.h
void main(void)
{
int n;//数组的长度
int *a;
cout 请输入数组的长度:endl;
cin n;
a = new int[n];
//动态申请了一个长度为n的连续空间,
//指针变量a与这块空间建立了联系
int i;
//输入
cout 请输入n个整数endl;
for( i = 0 ; i n ; i ++)
{
cin a[i];
}
//输出
cout 这n个整数是endl;
for( i = 0 ; i n ; i ++)
{
cout a[i] ;
}
cout endl;
delete [] a;//释放a所指向的一个连续空间
//原则:
//有new就有delete
//有new[],就有delete[]
}
说明:此时如果释放没有[],程序也能够运行,但不要这么做。因为有无[],内存的分配和释放原理不一样,
原则:如果在new表达式中使用[],必须在相应的delete表达式中也使用[]。
文档评论(0)