内存泄漏是很难避免的,不管是老手还是新手,都存在这个问题,甚至 Windows与 Linux
这类系统软件也或多或少存在着内存泄漏。
造成内存泄漏的最关键
原因
有以下:
1
.
指针重新赋值
,例如
char * p = (char *)malloc(10);
char * np = (char *)malloc(10);
p = np;
这样
p
开始指向的那块内存将无法访问到,造成内存泄漏,可以采用定义指针常量的方式来解决,例如:
char *const p = (char *)malloc(10);
char *const np = (char *)malloc(10);
p = np; //错误,p 为 const,不能改变
这样每个申请的指针便不能指向其他位置了
2.
子空间的遗忘
,
例如
struct RM_ad
{
char *p;
int num;
};
int main()
{
struct RM_ad *s = (struct RM_ad *)malloc(sizeof(struct RM_ad));
s->p = (char *)malloc(100);
free(s);
return 0;
}
当定义一个结构体时,为结构体里面的子成员申请空间后,先释放结构体指针,
那么子成员所申请的空间将泄漏,所以在对结构体做资源释放的时候应该遍历看各指针成员是否被释放
3.
返回值的不正确处理
.
例如
char *fun()
{
return (char *)malloc(100);
}
int main()
{
fun();
return 0;
}
以上代码 fun
函数返回了一段申请的空间地址,但是调用者没有正确使用指针去接受它,导致空间泄漏,所以应该始终正确处理返回动态分配的内存引用的函数返回值