[C++教学难点浅析] c哩c哩舞蹈教学视频
[摘要] 运用new运算符和delete运算符实现动态内存分配,是C++程序分配内存独有的内容。根据对象所在类的不同,创建对象时,调用构造函数的情况各有不同,特别是含有对象成员的派生类对象构造函数的调用顺序比较复杂。很多学生对上述知识点不能正确理解,形成学习障碍。通过参考相关书籍进行大量实验,深入分析研究它们的特点、规律及使用方法,并用于指导教学,收到了好的教学效果。
[关键词] C++ 教学难点 动态分配内存 构造函数调用
在对自考学生进行“C++程序设计”学习指导时,发现许多学生总是不能正确解答“动态分配内存”和“构造函数调用”这两个重要的知识点相关的问题。本文就这两个问题进行讨论。
1 动态分配和释放内存的问题
1.1问题的提出
动态分配内存几乎是所有应用程序的重要组成部分。C++提供的动态分配内存是由new和delete两个运算符实现的,在自考教材中多处提到,其中在第10页例1.3和第82页例4.8两处出现如下:
例1.3 例4.8
double *p; Point *ptr=new Point[2];
p=new double[3];……
……delete [ ]ptr;//释放内存
pelete p;//释放内存
上例中,两次动态定义的均是数组,但采用delete释放内存的方式确不同,且上机运行均能通过编译,从而给人以两种方式均正确的认识。
但是,在2009年10月全国试卷第49题中,对用data =new T[len]定义的动态数组,给出的标准答案只有一个即“delete[]data;”而不是“delete[]data;”或“delete data;”。到底怎样才是正确的呢?请看下面解答。
1.2单个对象内存空间的动态分配和释放
1.2.1动态分配
一般形式:数据类型*指针名=new数据类型(初值);
语句作用:通过new语句,动态分配一个能够存储指定数据类型数据的内存单元,并把分配到的内存初始化为某一个可知的初值,同时返回指向内存的开始处的指针。
注意:初始化部分的类型必须与内存分配的数据类型一致。
1.2.2释放内存
一般形式:delete指针名;
语句作用:告诉系统释放由new分配的单个内存单元。
几点注意:
(1)用new为指针分配内存,称为手工分配内存,这种方式分配的内存不能自动释放(由系统定义变量时分配的内存,当不再使用时,系统将会自动释放。),必须用delete手工释放。
(2)delete必须用在先前已由new成功分配内存的有效指针上,若用在了未用new分配内存的指针上,将会带来严重的问题,比如系统崩溃。
(3)对于一个用new分配内存的指针,只能用一次delete。
例1 double *p=new double(3.5);
……
pelete p;
1.3数组的动态分配及释放
1.3.1动态分配
一般形式:数据类型 *指针名=new数据类型[m];
语句作用:通过new语句动态分配一个由指定的数据类型所要求的连续m个内存单元,并返回指向首个单元开始处的指针。
注意:分配数组时不能给数组初始化,即不能给定初值。
1.3.2释放内存
一般形式:数据类型 []指针名;
语句作用:告诉系统用[]释放动态分配的数组。
注意:
(1)用delete释放一个动态数组时,还必须用[]形式告诉delete释放多大的内空间,否则内存长期占用,很快就会耗尽,造成内存泄漏。
(2)用delete释放由new分配数组时,只需用[],不必在括号中加数字说明数组长度。
例2动态分配对象数组。
#include
using namespace std;
class Point{private:int x,y;public:
Point():x(0),y(0){cout
using namespace std;
class object{ private:int val; public:
object( ):val(0){
cout container( ):data(0),one( ),two( ){
cout
using namespace std;
classPoint{public:Point(){cout
using namespace std;
class Point{private:int x; public:
Point(){x=0;cout