C指针(二) - 内存泄露杯具现场及对策

本文剖析了内存管理中常见的五大误区:未经初始化的内存使用导致的数据不确定性;内存越界引发的安全隐患;内存泄露造成的资源浪费;错误处理返回值忽视内存释放;访问野指针引发的程序崩溃。针对每个误区,文章提供了具体的应对方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、未经初始化的内存

【杯具现场】

     指针P申请了10字节的内存空间,但是没有对该内存进行初始化,我们称这块未经初始化内存为垃圾内存(JUNK),因为里面装有不确定的值。如果其他代码不小心使用了这块内存,离奇的杯具就上演了。


 【应对方法】
 

 

 

让memset在申请内存后使用。或者直接使用calloc。

注意:malloc 和 calloc的区别,调用成功后,这两个函数都返回申请内存的首地址。区别是calloc对这片内存初始化为'/0'(如果是指针则被初始化为空),而malloc没有对这片内存进行初始化。

 


 

二、内存越界

【杯具现场】--- 写越界

 

【应对方法】

注意读写区域间内存大小是否匹配。

 


 

【杯具现场】--- 读越界

 

【应对方法】

注意读写区域间内存大小是否匹配。


 

三、内存泄露

【杯具现场】--- 申请内存的指针转移指向

      分别为MemoryArea和NewArea分配10字节的内存空间。然后将MemoryArea指向了NewArea。这样的行为使MemoryArea原来所指向的内存区域成了孤魂野鬼,无法再用MemoryArea释放它。

 

 

 

 

 

 

 

【应对方法】

转移指针指向时,要保证被操作的指针原来未关联内存区域。

 

【杯具现场】--- 相关联的指针过早被释放

  memoryArea指针所指的第3个内存空间(NewArea指针)指向了另一块内存空间。这时如果先释放memoryArea的内存,那么NewArea所指向的空间就会变成孤魂野鬼,无法再用MemoryArea释放它。


 
 
【应对方法】
  

 

 


 

四、错误处理返回值

【杯具现场】

在func 中申请的内存后,返回了改内存的引用,但是在callingFunc 中没有处理func返回的引用进行内存释放。

【应对方法】

在callingFunc 函数中,对func 返回的指针进行处理。


五、访问野指针

 


 

 

 参考 http://www.ibm.com/developerworks/aix/library/au-toughgame/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值