71堆角存的分配与放 对于数组进行动忞分配的格式为 指针变量名=neW类型名[下标达式]; delete[]指向该数组的指针变量名; DU
7.1.1 堆内存的分配与释放 对于数组进行动态分配的格式为: 指针变量名=new 类型名[下标表达式]; delete [ ] 指向该数组的指针变量名;
71堆角存的分配与放 【例71】动态数组的建立与撒销 include <iostream .h> *include <string. h> void minot int n; char *pci cout<<"请输入动态数组的元素个数<<end CIn>>n; pc= new char[nP∥/ strcpy(pc"堆内存的动态分配" cout<<pc<<endi delete[]pc;/撤销并释放pc所指向的n个字符的内存空间 return i 1 DU
7.1.1 堆内存的分配与释放 【例7.1】动态数组的建立与撤销 #include <iostream.h> #include <string.h> void main(){ int n; char *pc; cout<<"请输入动态数组的元素个数"<<endl; cin>>n; pc=new char[n]; // strcpy(pc,"堆内存的动态分配"); cout<<pc<<endl; delete []pc; // 撤销并释放pc所指向的n个字符的内存空间 return ; }
71堆角存的分配与放 动态分配的三个特点:首先,变量n在编译时没有 确定的值,而是在运行中输入,按运行时所需分配堆空 间,这一点是动态分配的优点,可克服数组“大开小用” 的弊端,在第六章中表,排序与查找中的算法,若用动 态数组,通用性更佳。 delete[]pc是将n个字符的空间 释放,而用 delete pc则只释放了一个字符的空间;其 次如果有一个char*pc1,令pc1=p,同样可用 delete []pc1来释放该空间。尽管C++不对数组作边界检查 但在堆空间分配时,对数组分配空间大小是纪录在案的 第三,没有初始化式( initializer),不可对数组初始 化 DU
7.1.1 堆内存的分配与释放 动态分配的三个特点:首先,变量n在编译时没有 确定的值,而是在运行中输入,按运行时所需分配堆空 间,这一点是动态分配的优点,可克服数组“大开小用” 的弊端,在第六章中表,排序与查找中的算法,若用动 态数组,通用性更佳。delete []pc是将n个字符的空间 释放,而用delete pc则只释放了一个字符的空间;其 次如果有一个char *pc1,令pc1=p,同样可用delete [] pc1来释放该空间。尽管C++不对数组作边界检查, 但在堆空间分配时,对数组分配空间大小是纪录在案的。 第三,没有初始化式(initializer),不可对数组初始 化
71堆角存的分配与放 指针使用的几个问题: 1.动态分配失败。回一个空指 ,表示 生了异常, 分配失败 2.指针删除与堆空间释放。删除一个指针p( delete p;) 实际意思是删除了p所指的目标(变量或对象等),释 放了它所占的堆空间,而不是删除p本身,释放堆空间 后,p成了空悬指针 DU
7.1.1 堆内存的分配与释放 指针使用的几个问题: 1.动态分配失败。返回一个空指针(NULL),表示 发生了异常,堆资源不足,分配失败。 2.指针删除与堆空间释放。删除一个指针p(delete p;) 实际意思是删除了p所指的目标(变量或对象等),释 放了它所占的堆空间,而不是删除p本身,释放堆空 间 后,p成了空悬指针
71堆角存的分配与放 3 emory leak)和 neW与 delete是配对使用的, delete只能释放堆空间 如果new返回的指针值丢失,则所分配的堆空间无 法回收,称内存泄漏,同一空间重复释放也是危险 的,所以必须妥善保存new返回的指针,以保证不 发生内存泄漏,也必须保证不会重复释放堆内存空 间 4.动态分配的变量或对象的生命期。无名对一的 用域,比如在 返国仍可使 Sto DEU
7.1.1 堆内存的分配与释放 3.内存泄漏(memory leak)和重复释放。new与 delete 是配对使用的, delete只能释放堆空间。 如果new返回的指针值丢失,则所分配的堆空间无 法回收,称内存泄漏,同一空间重复释放也是危险 的,所以必须妥善保存new返回的指针,以保证不 发生内存泄漏,也必须保证不会重复释放堆内存空 间。 4.动态分配的变量或对象的生命期。无名对象,它的 生命期并不依赖于建立它的作用域,比如在函数中 建立的动态对象在函数返回后仍可使用。我们也称 堆空间为自由空间(free store)就是这个原因