当前位置: 首页 > 文档资料 > C++大学教程 >

7.6 动态内存分配与 new 和 delete 运算符

优质
小牛编辑
138浏览
2023-12-01

new 和 delete 运算符提供了比 C语言的 malloc 和 free 函数调用更好的动态分配内存方法(对任何内部或用户自定义类型)。考虑下列代码:

TypeName *typeNamePtr;

在ANSI C语言中,要为 TypeName 类型对象动态分配内存,可以用下列语句:

typeNamePtr = malloc(sizeof(TypeName));

这就要求调用 malloc 函数和显式使用 sizeof 运算符,在 ANSI C 之前的 C语言版本中,还要将 malloc 返回的指针进行类型转换(TypeName *)。malloe 函数中没有提供初始化所分配内存块的方法。而在 C++ 中,只要用下列语句;

typeNamePtr = new TypeName;

new 运算符自动生成正确长度的对象并调用对象构造函数和返回正确类型的指针。如果new无法找到内存空间,则它在 ANSI/ISO C++ 草案标准之前的 C++ 版本中返回。指针(注意,第13章介绍了如何在 ANSI/ISO C++ 草案标准中处理 New 故障。我们要显示new如何“抛出”异常,如何”捕获”与处理异常)。要在 C++ 中释放这个对象的空间,就要用 delete 运算符,如下所示:

delete typeNamePtr;

C++ 允许对新生成的对象提供初始化值,如下所示:

float *thingPtr = new float(3.14159);

将新生成的对象 float 初始化为 3.14159。

可以生成10个元素的整型数组并赋给 arrayPtr,如下所示:

int *arrayPtr = new int[lO];

这个数组可以用下列语句删除:

delete [] arrayPtr;

可以看出,使用 neW 和 delete 而不用 malloc 和 free 还有其他好处。neW 自动调用构造函数,delete 自动调用析构函数。

常见编程错误 7.8
将 new 和 delete 动态分配内存的方法与 malloc 和 free 动态分配内存的方法混合使用是个逻辑错误:malloc 分配的空间无法用 delete 释放,new 生成的对象无法用 free 删除。

常见编程错误 7.9
用 delete 而不是 delete[] 删除数组可能导致运行时的逻辑错误。为了避免这个问题,数组生成的内存空间要用 delete[] 运算符删除,各个元素生成的内存空间要用 delete 运算符删除。

编程技巧 7.3
C++ 程序也可以包含用 malloc 生成和用 free 删除的存储空间以及用 new 生成和用 delete 删除的对象。但最好还是使用 new 和 delete。