4动态内存分配1new运算符c语言中的动态内存分配和....pptVIP

  • 5
  • 0
  • 约6.13千字
  • 约 21页
  • 2019-05-11 发布于天津
  • 举报

4动态内存分配1new运算符c语言中的动态内存分配和....ppt

* 1.4 动态内存分配 1.4.1 new运算符 c语言中的动态内存分配和释放函数: int *p=(int *)malloc(sizeof(int)); free(p); 在堆空间中申请分配内存。希望能自己判断所申请的内存空间大小和应返回的指针类型,避免使用强制类型转换和sizeof运算符。 ¤语法:数据类型 *指针变量=new 数据类型 例如:char *pc=new char;//在堆空间创建char型无名对象,返回指向该对 //象的指针,对该对象的操作由指针来完成 分配的内存未初始化,可以在申请内存时进行初始化。 ¤语法:数据类型 *指针变量=new 数据类型(初值); 例如:int *p=new int(0); 可以为数组申请内存空间,长度可以不必是常量: ¤语法:数据类型 *指针变量=new 数据类型[长度]; 例如:int *pa=new[10]; // 数组元素不能进行初始化 int (*pa)[4]=new int[3][4]; 若内存分配失败,返回NULL指针。 1.4.2、delete运算符 释放由new运算符申请的内存空间 ¤语法:delete 指针变量; delete[] 指针变量;// 释放动态数组内存空间 例如:delete p; delete[] pa; 当无名对象占据的内存空间被释放时,该对象的生存期结束。 注意区分无名对象的生存期和指向该对象的指针的生存期。 例如: { char *p=new char[20]; strcpy(p,”hello”); delete [] p; …//此时p的值不变,p成为空悬指针,即指向无效内存的指针。最好在指//针指向的动态对象被释放后,将该指针设置为0,即p=0; 1.4.3 容易出现的错误 (1)内存泄漏 没有通过delete释放动态分配的内存单元 (2) 悬挂引用 int *p1=new int; int *p2=p1; delete p1;//多个指针指向同一对象 第2章 c++的函数 2.1 c++中的函数 2.1.1 函数原型 函数调用之前必须进行定义或者声明,说明函数的返回值类型、参数类型、个数。只有声明为void返回类型的函数可以省略return语句。缺省返回类型为int。若未声明函数参数,则认为参数表为空,无参数。无参函数应该在参数表中用void显式声明。 2.1.2 inline函数 从软件工程角度看,将程序实现为一组函数很有好处,但函数调用却会增加执行时的开销。 带参数的宏: #define S(a,b) a*b int main ( ) { double area,l,w; … area=S(l,w);// 编译预处理后成为area=l*w; area=S(l+3,w+5); // 编译预处理后成为area=l+3*w+5; 不进行类型检查,只是实参代替形参进行展开替换,易出现意想不到的错误;优点是不用入栈保护、传递参数,效率较高。 可以将函数定义为内联(inline)函数。对内联函数不进行编译。在调用内联函数时,经编译器检查无误后,将函数体展开在调用处。 ¤语法:在函数返回类型前加上inline关键字。 例如:inline double s(double a,double b) {return a*b;} int main( ) { … area=s(l,w); //编译时展开为area=l*w; 注意:①函数应该短小,一般只允许3~5行,一般不能使用循环语句,不能将递归函数定义为内联函数。 ②内联函数在调用前必须进行完整的定义。内联函数必须在调用该函数的每个文本文件中定义,通常内联函数的定义放在头文件中。 ③使用内联函数可以减少执行时间,但会增加程序长度。 2.1.3 函数的缺省参数 如果函数调用时某些实参值总相同,可以使用缺省参数。在函数的定义或声明的参数表中

文档评论(0)

1亿VIP精品文档

相关文档