最近了解到关于检测内存错误的利器:purify、Boundschecker、Valgrind。有种相见恨晚的感觉,于是就顺便总结下最近遇到的几类内存错误问题。
1、上层模块的程序员对下层模块的内存使用生命周期不清晰,导致野指针的出现。
为了减少数据拷贝,有些底层模块设计一些接口的时候需要上层申请内存传入。上层模块的程序员对这些接口的重视不足,不清楚内存的生命周期,以为调用完该接口以后就可以释放。
这个时候刚刚传入给底层模块的指针就变成了野指针。底层模块对内存的后续读写都是非法的。
示例
下层模块B:moduleB_packet(void *p)
上层模块A:moduleA_packet(void *p) {
pdata = malloc(1024);
moduleB_packet(pdata); // 模块B内部没有做数据拷贝
free(pdata); // 模块B还在访问 pdata;
}
2、