C++ 动态内存
动态内存(Dynamic Memory)又称自由存储区(Free Store),是程序在运行时动态地为变量和数据结构申请内存空间的一种方式。与静态内存相比,动态内存分配申请时无法确定具体的内存大小和存储位置,需要在程序运行时进行确定。
在C语言中,动态内存的申请和释放需要使用库函数malloc()和free(),这两个函数被定义在stdlib.h头文件中。
1. malloc()函数
malloc函数用于动态分配内存,其原型为:
void *malloc(size_t size);
其中,size_t是一个无符号整数类型,它用于表示内存块大小的字节数。malloc函数返回一个void类型的指针(void *),指向分配的内存区域的起始地址。如果内存分配失败,malloc函数返回空指针(NULL)。
2. free()函数
free函数用于释放动态分配的内存,其原型为:
void free(void *ptr);
其中,ptr是一个指向要释放的内存区域的指针。须注意,ptr必须是一个通过malloc、calloc或realloc函数所分配的指针,否则释放操作将会出现未定义的行为。
3. 动态内存的使用
动态内存的使用分为以下几个步骤:
3.1 分配内存空间
使用malloc函数申请一段内存空间,其大小由实际需求决定,例如:
int *p = (int *)malloc(sizeof(int) * 5);
上述代码申请了一段可以存放5个int类型数据的内存空间,并将该内存空间的起始地址赋值给指针变量p。
3.2 使用内存空间
通过指针p访问申请到的内存空间,例如:
p[0] = 1; p[1] = 2; p[2] = 3; p[3] = 4; p[4] = 5;
上述代码将1~5的值分别存储到了内存空间中。
3.3 释放内存空间
在不需要使用动态内存的时候,必须使用free函数释放该内存空间,否则会造成内存泄漏。例如:
free(p);
4. 动态内存的注意事项
- 动态内存申请成功后,应该对内存空间进行初始化,以避免使用时出现未定义的行为;
- 在申请内存时,应该考虑内存分配失败的情况,避免程序出现异常情况;
- 在释放内存时,应该仔细检查指针是否满足条件,并且避免重复释放已经被释放的内存空间;
- 在动态分配的内存空间中,数据的值可以自由改变,因此在使用过程中应该注意不要越界、覆盖、遗漏等情况。
