C语言的内存分配详解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.没有初始化式(initializer),不可对数组初始化。
动态数组举例
读懂各个小题程序,为了便于
(1) (本小题10分)读懂如下程序: void main() #include <iostream.h> #include <math.h> { double TriangleArea( ) double dArea; { dArea=TriangleArea( ); int i; if (dArea==-1) cout<<" The double dTArea; 7 double* pds = new double[5]; program failed!"<< endl; 8 if (!pds) else cout << "The area of 9 { cout << "Error memory allocation!"<<endl; triangle is " <<dArea<<endl; 10 return -1; } 11 } pds[0]=0; 请写出下列问题答案: for(i=1;i<4;i++) 第7行起何作用?(2分) { 答: cout << "the side is:"; 第8-11行可否省去?并说明原因。(2分) cin >>pds[i]; 答: pds[0]+=pds[i]/2; 第23行起何作用?(2分) } 答: pds[4]= pds[0]; for(i=1;i<4;i++) pds[0] *= ( pds[4] - pds[i]); 此程序功能是什么?若对三次“the side is:”提示回 答分别为3,4,5,请写出执行结果输出的内容。(4 dTArea=sqrt(pds[0]); 分) 23 delete []pds; 答: return dTArea; }
பைடு நூலகம்
3、堆区是不会在分配时做自动初始化的(包括清 零),所以必须用初始化式(initializer)来显式初 始化。new表达式的操作序列如下:从堆区分配对象, 然后用括号中的值初始化该对象。
堆空间申请、释放演示
1.用初始化式(initializer)来显式初始化
int *pi=new int(0); 2.当pi生命周期结束时, 必须释放pi所指向的目标: delete pi; 注意这时释放了pi所指的目标的内存空间,也就是 撤销了该目标,称动态内存释放(dynamic memory deallocation),但指针pi本身并没有撤销,它自 己仍然存在,该指针所占内存空间并未释放。 Pi 0 堆
堆空间申请、释放说明
1、new运算符返回的是一个指向所分配类型变量(对 象)的指针。对所创建的变量或对象,都是通过该指 针来间接操作的,而且动态创建的对象本身没有名字。 2、一般定义变量和对象时要用标识符命名,称命名 对象,而动态的称无名对象(请注意与栈区中的临时 对象的区别,两者完全不同:生命期不同,操作方法 不同,临时变量对程序员是透明的)。
#include <iostream.h> 动态一维数组的建立 #include <string.h> 与撤销 void main(){ int n; char *pc; cout<<"请输入动态数组的元素个数"<<endl; cin>>n; //n在运行时确定,可输入17 pc=new char[n]; //申请17个字符(可装8个 汉字和一个结束符)的内存空间 strcpy(pc,“堆内存的动态分配”);// cout<<pc<<endl; delete []pc;// 释放 pc 所指向的 n 个字符的内 存空间 return ; }
在堆中建立动态一维数组
1、申请数组空间: 指针变量名=new 类型名[下标表达式]; 注意:“下标表达式”不是常量表达式,即它的值不 必在编译时确定,可以在运行时确定。 2、释放数组空间: delete [ ]指向该数组的指针变量名; 注意:方括号非常重要的,如果delete语句中少了方 括号,因编译器认为该指针是指向数组第一个元素的, 会产生回收不彻底的问题(只回收了第一个元素所占 空间),加了方括号后就转化为指向数组的指针,回 收整个数组。delete [ ]的方括号中不需要填数组元素 数,系统自知。即使写了,编译器也忽略。
堆内存分配
C/C++定义了4个内存区间:代码区,全局变 量与静态变量区,局部变量区即栈区,动态存储 区,即堆(heap)区或自由存储区(free store)。
堆内存的分配与释放
堆的概念
通常定义变量(或对象),编译器在编译时都可 以根据该变量(或对象)的类型知道所需内存空间的大小,从 而系统在适当的时候为他们分配确定的存储空间。这种内存分 配称为静态存储分配; 有些操作对象只在程序运行时才能确定,这样编译时就 无法为他们预定存储空间,只能在程序运行时,系统根据运行 时的要求进行内存分配,这种方法称为动态存储分配。所有动 态存储分配都在堆区中进行。 当程序运行到需要一个动态分配的变量或对象时,必须 向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该 变量或对象。当不再使用该变量或对象时,也就是它的生命结 束时,要显式释放它所占用的存贮空间,这样系统就能对该堆 空间进行再次分配,做到重复使用有限的资源。
下面是关于new 操作的说明
1、new运算符返回的是一个指向所分配类型变量 (对象)的指针。对所创建的变量或对象,都是 通过该指针来间接操作的,而动态创建的对象本 身没有名字。 2、一般定义变量和对象时要用标识符命名,称命 名对象,而动态的称无名对象(请注意与栈区中的 临时对象的区别,两者完全不同:生命期不同, 操作方法不同,临时变量对程序员是透明的 )。 3、堆区是不会在分配时做自动初始化的(包括清 零),所以必须用初始化式(initializer)来显 式初始化。new表达式的操作序列如下:从堆区分 配对象,然后用括号中的值初始化该对象。
堆内存的分配与释放
堆空间申请、释放的方法
在C++中,申请和释放堆中分配的存贮空间, 分别使用new和delete的两个运算符来完成: 指针变量名=new 类型名(初始化式); delete 指针名; 例如:1、 int *pi=new int(0); 它与下列代码序列大体等价: 2、int ival=0, *pi=&ival; 区别:pi所指向的变量是由库操作符new()分配的, 位于程序的堆区中,并且该对象未命名。
动态一维数组的说明
1.变量n在编译时没有确定的值,而是在运行中输入, 按运行时所需分配堆空间,这一点是动态分配的优 点,可克服数组“大开小用”的弊端,在表、排序 与查找中的算法,若用动态数组,通用性更佳。一 定注意:delete []pc是将n个字符的空间释放,而 用delete pc则只释放了一个字符的空间; 2.如果有一个char *pc1,令pc1=p,同样可用 delete [] pc1来释放该空间。尽管C++不对数组作 边界检查,但在堆空间分配时,对数组分配空间大 小是纪录在案的。
动态数组举例
读懂各个小题程序,为了便于
(1) (本小题10分)读懂如下程序: void main() #include <iostream.h> #include <math.h> { double TriangleArea( ) double dArea; { dArea=TriangleArea( ); int i; if (dArea==-1) cout<<" The double dTArea; 7 double* pds = new double[5]; program failed!"<< endl; 8 if (!pds) else cout << "The area of 9 { cout << "Error memory allocation!"<<endl; triangle is " <<dArea<<endl; 10 return -1; } 11 } pds[0]=0; 请写出下列问题答案: for(i=1;i<4;i++) 第7行起何作用?(2分) { 答: cout << "the side is:"; 第8-11行可否省去?并说明原因。(2分) cin >>pds[i]; 答: pds[0]+=pds[i]/2; 第23行起何作用?(2分) } 答: pds[4]= pds[0]; for(i=1;i<4;i++) pds[0] *= ( pds[4] - pds[i]); 此程序功能是什么?若对三次“the side is:”提示回 答分别为3,4,5,请写出执行结果输出的内容。(4 dTArea=sqrt(pds[0]); 分) 23 delete []pds; 答: return dTArea; }
பைடு நூலகம்
3、堆区是不会在分配时做自动初始化的(包括清 零),所以必须用初始化式(initializer)来显式初 始化。new表达式的操作序列如下:从堆区分配对象, 然后用括号中的值初始化该对象。
堆空间申请、释放演示
1.用初始化式(initializer)来显式初始化
int *pi=new int(0); 2.当pi生命周期结束时, 必须释放pi所指向的目标: delete pi; 注意这时释放了pi所指的目标的内存空间,也就是 撤销了该目标,称动态内存释放(dynamic memory deallocation),但指针pi本身并没有撤销,它自 己仍然存在,该指针所占内存空间并未释放。 Pi 0 堆
堆空间申请、释放说明
1、new运算符返回的是一个指向所分配类型变量(对 象)的指针。对所创建的变量或对象,都是通过该指 针来间接操作的,而且动态创建的对象本身没有名字。 2、一般定义变量和对象时要用标识符命名,称命名 对象,而动态的称无名对象(请注意与栈区中的临时 对象的区别,两者完全不同:生命期不同,操作方法 不同,临时变量对程序员是透明的)。
#include <iostream.h> 动态一维数组的建立 #include <string.h> 与撤销 void main(){ int n; char *pc; cout<<"请输入动态数组的元素个数"<<endl; cin>>n; //n在运行时确定,可输入17 pc=new char[n]; //申请17个字符(可装8个 汉字和一个结束符)的内存空间 strcpy(pc,“堆内存的动态分配”);// cout<<pc<<endl; delete []pc;// 释放 pc 所指向的 n 个字符的内 存空间 return ; }
在堆中建立动态一维数组
1、申请数组空间: 指针变量名=new 类型名[下标表达式]; 注意:“下标表达式”不是常量表达式,即它的值不 必在编译时确定,可以在运行时确定。 2、释放数组空间: delete [ ]指向该数组的指针变量名; 注意:方括号非常重要的,如果delete语句中少了方 括号,因编译器认为该指针是指向数组第一个元素的, 会产生回收不彻底的问题(只回收了第一个元素所占 空间),加了方括号后就转化为指向数组的指针,回 收整个数组。delete [ ]的方括号中不需要填数组元素 数,系统自知。即使写了,编译器也忽略。
堆内存分配
C/C++定义了4个内存区间:代码区,全局变 量与静态变量区,局部变量区即栈区,动态存储 区,即堆(heap)区或自由存储区(free store)。
堆内存的分配与释放
堆的概念
通常定义变量(或对象),编译器在编译时都可 以根据该变量(或对象)的类型知道所需内存空间的大小,从 而系统在适当的时候为他们分配确定的存储空间。这种内存分 配称为静态存储分配; 有些操作对象只在程序运行时才能确定,这样编译时就 无法为他们预定存储空间,只能在程序运行时,系统根据运行 时的要求进行内存分配,这种方法称为动态存储分配。所有动 态存储分配都在堆区中进行。 当程序运行到需要一个动态分配的变量或对象时,必须 向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该 变量或对象。当不再使用该变量或对象时,也就是它的生命结 束时,要显式释放它所占用的存贮空间,这样系统就能对该堆 空间进行再次分配,做到重复使用有限的资源。
下面是关于new 操作的说明
1、new运算符返回的是一个指向所分配类型变量 (对象)的指针。对所创建的变量或对象,都是 通过该指针来间接操作的,而动态创建的对象本 身没有名字。 2、一般定义变量和对象时要用标识符命名,称命 名对象,而动态的称无名对象(请注意与栈区中的 临时对象的区别,两者完全不同:生命期不同, 操作方法不同,临时变量对程序员是透明的 )。 3、堆区是不会在分配时做自动初始化的(包括清 零),所以必须用初始化式(initializer)来显 式初始化。new表达式的操作序列如下:从堆区分 配对象,然后用括号中的值初始化该对象。
堆内存的分配与释放
堆空间申请、释放的方法
在C++中,申请和释放堆中分配的存贮空间, 分别使用new和delete的两个运算符来完成: 指针变量名=new 类型名(初始化式); delete 指针名; 例如:1、 int *pi=new int(0); 它与下列代码序列大体等价: 2、int ival=0, *pi=&ival; 区别:pi所指向的变量是由库操作符new()分配的, 位于程序的堆区中,并且该对象未命名。
动态一维数组的说明
1.变量n在编译时没有确定的值,而是在运行中输入, 按运行时所需分配堆空间,这一点是动态分配的优 点,可克服数组“大开小用”的弊端,在表、排序 与查找中的算法,若用动态数组,通用性更佳。一 定注意:delete []pc是将n个字符的空间释放,而 用delete pc则只释放了一个字符的空间; 2.如果有一个char *pc1,令pc1=p,同样可用 delete [] pc1来释放该空间。尽管C++不对数组作 边界检查,但在堆空间分配时,对数组分配空间大 小是纪录在案的。