- 动态内存分配后未释放:
#include <stdio.h>
#include <stdlib.h>
void memoryLeakExample1() {
int *ptr = (int *)malloc(sizeof(int));
// 这里没有free(ptr)
}
- 原因:
malloc
函数用于在堆上分配内存空间,分配成功后返回一个指向该内存的指针。如果在程序结束前没有使用free
函数释放这块内存,这块内存就无法被系统回收,导致内存泄漏。即使函数执行完毕,指针ptr
超出作用域被销毁,但它所指向的内存依然存在,却无法再访问和释放。
- 内存释放后继续使用指针:
#include <stdio.h>
#include <stdlib.h>
void memoryLeakExample2() {
int *ptr = (int *)malloc(sizeof(int));
*ptr = 10;
free(ptr);
// 这里继续使用ptr是错误的,可能导致内存泄漏和未定义行为
printf("%d\n", *ptr);
}
- 原因:当调用
free(ptr)
后,ptr
所指向的内存已被释放回系统。此时再使用ptr
访问内存,一方面这块内存可能已被系统重新分配给其他用途,导致数据错误;另一方面,系统会认为程序对已释放的内存进行非法访问,这是一种未定义行为。如果后续又重新分配内存,而原指针仍指向已释放的地址,就可能造成内存无法正确管理,间接导致内存泄漏。
- 在循环中频繁分配内存但未释放:
#include <stdio.h>
#include <stdlib.h>
void memoryLeakExample3() {
for (int i = 0; i < 10; i++) {
int *ptr = (int *)malloc(sizeof(int));
// 这里没有在每次循环结束时释放ptr
}
}
- 原因:每次循环都会分配一块新的内存,但都没有释放。随着循环次数增加,会不断有新的内存被分配且无法回收,造成大量内存泄漏,最终可能耗尽系统的堆内存资源。
- 函数返回动态分配的内存指针,但调用者未释放:
#include <stdio.h>
#include <stdlib.h>
int* createArray() {
int *arr = (int *)malloc(10 * sizeof(int));
return arr;
}
void memoryLeakExample4() {
int *result = createArray();
// 这里没有free(result)
}
- 原因:
createArray
函数分配了内存并返回指针,调用函数memoryLeakExample4
接收了这个指针,但如果在memoryLeakExample4
函数中没有释放result
所指向的内存,这块内存就无法被回收,导致内存泄漏。