- 释放已释放的指针
- 要点:避免对已经释放的指针再次调用
free
。一旦内存被释放,指针所指向的内存区域已归还给系统,再次释放会导致未定义行为。
- 举例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(sizeof(int));
if (ptr == NULL) {
perror("malloc");
return 1;
}
free(ptr);
free(ptr); // 再次释放已释放的指针,这是错误的
return 0;
}
- 可能导致的问题:这可能会破坏堆内存管理结构,导致程序崩溃,或者产生难以调试的逻辑错误。
- 释放非动态分配的内存
- 要点:
free
只能用于释放通过malloc
、calloc
或realloc
分配的动态内存。不能释放栈上的变量或其他非动态分配的内存。
- 举例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int num = 10;
int *ptr = #
free(ptr); // 试图释放栈上变量的地址,这是错误的
return 0;
}
- 可能导致的问题:这同样会导致未定义行为,可能破坏内存结构,导致程序崩溃。
- 未初始化指针的释放
- 要点:确保在调用
free
之前,指针已经正确初始化并指向动态分配的内存。如果指针是未初始化的,free
不知道要释放哪里的内存,会导致未定义行为。
- 举例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
free(ptr); // 释放未初始化的指针,这是错误的
return 0;
}
- 可能导致的问题:可能会释放任意内存位置,破坏其他数据或程序的内存布局,导致程序崩溃或出现逻辑错误。
- 释放不完全
- 要点:对于多维数组或链表等复杂数据结构动态分配的内存,要确保释放所有相关的动态内存块。
- 举例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int **matrix = (int **)malloc(3 * sizeof(int *));
for (int i = 0; i < 3; i++) {
matrix[i] = (int *)malloc(3 * sizeof(int));
}
free(matrix); // 只释放了外层指针数组,内层数组的内存未释放,这是错误的
return 0;
}
- 可能导致的问题:这会导致内存泄漏,随着程序运行,未释放的内存会不断积累,最终耗尽系统内存资源。