C语言中的指针和内存泄漏

C语言中的指针和内存泄漏

导致内存破坏的指针操作类型
  1. 指针赋值
  2. 复制内存区域
  3. 内存覆盖
使用动态内存必须考虑的检查点
  1. 未初始化的内存
    使用malloc函数申请的内存空间,没有初始化就直接通过指针访问,这时候内存空间中可能有的垃圾值会被使用,程序动向不可预测。因此应该结合memset使用,申请空间后第一时间调用memset函数进行初始化。
  2. 内存覆盖
    指向一块内存区域的指针p占用了不属于他的内存空间,这时候就很有可能覆盖了有价值的内存区域。当操作系统再次分配内存,很有可能会紧挨着p指向的内存区域分配空间,这时候就会破坏p的内存空间。(覆人者人哼覆之)
    良好的实践: 每当向指针写入值时,都要确保对可用字节数和所写入字节数进行交叉核对。一般情况memcpy函数将适用于此目的的检查点。
  3. 内存读取越界(overread)
    overread指所读取的字节数多于他们应有的字节数。结果:可能会出现很奇怪的输出。这个问题不太严重。
导致内存泄漏的场景
  1. 为指针重新赋值——指针之前指向的内存区域无法访问了,除非还有其他指针指向该内存区域。
  2. 释放内存首先把父块释放掉了——由于子块内存的指针在父块内存中存放,先释放了父块内存,子块的指针就没有了,当然指向的内存就泄露了。
  3. 返回值(指向动态申请内存区域的指针)的不正确处理——调用函数没有很好的处理返回的指针,或遗弃或错误处理,导致内存泄漏。
  4. 归还你所申请的内存——始终要跟踪所有内存分配,在合适的时候释放他们。

参考链接1
https://www.ibm.com/developerworks/cn/aix/library/au-toughgame/

参考链接2
http://www.yebangyu.org/blog/2015/11/06/null-pointer-can-be-accessed/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值