内存泄漏怎么解决?

内存泄漏怎么解决?

什么是内存泄漏
内存泄漏是指你向系统申请分配内存进行使用(malloc/new),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使用完了却没有释放(free/delete),导致这个不使用的对象一直占据内存单元(堆区),直到程序结束,造成系统将不能再把它分配给需要的程序。(只有在堆内存里面才会发生内存泄漏,因为栈区内存在分配空间后还会自动释放空间)
解决方法:
(1)每个内存分配函数都应该有一个** free 函数**与之对应,alloca 函数除外。(alloca函数是向栈区申请内存,它所分配的内存空间会被自动释放)

char *a = (char *)malloc(10);
...
free(a);

(2)每次分配内存之后都应该及时进行初始化,可以结合 memset 函数进行初始化,calloc 函数除外。(calloc函数会将所分配的内存空间中的每一位都初始化为0)

char *a = (char *)malloc(10);
memset(a,0,sizeof(a));
...
free(a);

(3)每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。(申请的字节数要小于现有的可用字节数)

char *ptr = (char *)malloc(10);
char name[20] ;
memcpy ( name,ptr,20); // Problem begins here
在本例中,memcpy 操作尝试从 ptr 读取 20 个字节,但是后者仅被分配了 10 个字节。这会导致不希望的输出。


(4)在对指针赋值前,一定要确保没有内存位置会变为孤立的。(要free)

char *memsoryArea = malloc(10);
char *newArea = malloc(10);
memoryArea = newArea;
上述代码中,memoryArea以前所指向的内存位置变成了孤立,它无法释放,因为没有指向该位置的引用。这会导致10个字节的内存泄漏。

(5)每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应先遍历子内存位置并从那里开始释放,然后再遍历回父节点。(要从里到外的free****)
在这里插入图片描述

假设有一个指针 p,它指向一个 10 字节的内存位置。该内存位置的第三个字节又指向np动态分配的10个字节的内存配置.

如果通过调用 free 来释放了p,则 np指针也会因此而变得无效。np 以前所指向的内存位置无法释放,因为已经没有指向该位置的指针。换句话说,np所指向的内存位置变为了孤立的,从而导致了内存泄漏。

(6)始终正确处理返回动态分配的内存引用的函数返回值。(你申请了地址,系统给你分配了,但是你没有接受,这块地址就找不到了)

char *func ( )
{
return malloc(20);
}
void callingFunc ( )
{
func ( ); // Problem lies here
}
在上面的示例中,callingFunc() 函数中对 func() 函数的调用未处理该内存位置的返回地址。结果,func() 函数所分配的 20 个字节的块就丢失了,并导致了内存泄漏。

(7)确保没有在访问空指针
(指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。空指针用0或NULL表示,C语言保证这个值不会是任何对象的地址,使它不再指向任何有意义的东西。)
访问空指针是非常危险的,因为它可能使您的程序崩溃。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值