内存空间的分配与释放
指针的最大用途是直接操作内存,C++提供了直接分配内存并赋予指针的方法来在不声明变量的情况下动态在内存中创建数据存储区。在 C 语言中,动态分配内存是通过malloc()
来完成的,但是在 C++中提供了关键字new
。动态分配一个内存区域并赋予指针的语法为数据类型 *指针变量名称=new 数据类型;
,例如int *ip = new int;
。这样动态分配得到的内存区域通常会被称为数据对象,以此来跟变量区分开。
除了可以动态分配普通数据类型内存以外,还可以动态创建数组。例如创建一个可以存储 10 个元素的整型数组的格式为int *a = new int [10];
。
在运行时动态分配的内存在使用完毕时必须使用关键字delete
释放,否则这块内存区域将变为泄露区,使得程序占用的内存越来越大。要释放动态创建的数组,需要使用语法格式delete []
。例如以下示例。
int *p = new int;
int *pa = new int [30];
delete p;
delete [] pa;
在使用动态内存分配和释放时,需要遵循以下规则:
- 不要使用
delete
来释放不使用new
分配的内存。 - 不要使用
delete
释放同一个内存区块两次。 - 如果使用
new []
为数组分配内存,则必须使用delete []
来释放。 - 对空指针使用
delete
是安全的。
使用malloc
和free
malloc()
和free()
是 C/C++的标准库函数,它们所完成的功能比new
和delete
更加低级。malloc()
和free()
仅仅是向系统申请和释放固定长度的内存区块,并不会像new
和delete
一样可以执行目标类型中的构造函数和析构函数。
以下给出一个malloc()
和free()
的使用示例。
Object *a = (Object *)malloc(sizeof(Object)); // 分配并将内存区块转换为目标类型
a->Init(); // 注意,目标对象必须手工初始化
// ...执行处理过程
a->Destory(); // 再次手工执行析构
free(a); // 释放相应的内存区块