容易出现的问题:
- 使用malloc分配内存后没有清零内存,可以使用memset或者calloc来初始化内存,进行清零操作
- 没有检查分配内存函数的返回值。但C++的new出错会抛出异常。
- 引用已释放的内存
- 多次释放内存
- 不匹配的动态内存管理函数。比如malloc跟free配对,new和delete配对,但malloc的内存不能用delete来释放。
- 未正确区分标量和数组。比如用new分配的数组a[2],必须用delete [] a来释放。
- 对内存分配函数的不当使用。比如使用malloc(0),最好避免这种0长度的内存分配
缓解方法:
- 空指针。释放内存后指针置NULL。
- 一致的内存管理约定。比如:
- 使用同样的模式分配和释放内存。比如在C++中,在构造函数中进行所有的内存分配,在析构函数中进行所有的内存释放。
- 在同一个模块中,在同一个抽象层次中,分配和释放内存。
- 让分配和释放配对。
- 堆完整性检测。需要修改内存结构块和管理函数。
- 内存随机化。比如内核使用mmap来分配或者映射附加的内存页。
- 运行时分析工具。可以检测出内存访问违例。