#include <stdio.h>
#include <stdlib.h>
void createAndInitArray(int n) {
int **ptrArray = (int **)malloc(n * sizeof(int *));
if (ptrArray == NULL) {
perror("malloc");
return;
}
for (int i = 0; i < n; i++) {
ptrArray[i] = (int *)malloc(10 * sizeof(int));
if (ptrArray[i] == NULL) {
// 如果分配失败,释放之前分配的内存
for (int j = 0; j < i; j++) {
free(ptrArray[j]);
}
free(ptrArray);
perror("malloc");
return;
}
for (int k = 0; k < 10; k++) {
ptrArray[k] = k + 1;
}
}
// 释放内存
for (int i = 0; i < n; i++) {
free(ptrArray[i]);
}
free(ptrArray);
}
int main() {
int n = 3;
createAndInitArray(n);
return 0;
}
内存泄漏风险及避免方法
- 风险:
- 如果在分配
ptrArray
时malloc
失败,函数直接返回,此时不会释放任何内存,但也没有成功创建所需的数据结构,可能导致内存泄漏。
- 如果在分配
ptrArray[i]
时malloc
失败,已经分配的ptrArray[0]
到ptrArray[i - 1]
以及ptrArray
本身的内存没有释放,会造成内存泄漏。
- 避免方法:
- 在每次
malloc
调用后检查返回值是否为NULL
,若为NULL
表示分配失败,及时释放之前已成功分配的内存。如代码中所示,在分配ptrArray
和ptrArray[i]
后都进行了检查,并在分配失败时释放之前分配的内存。