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