如何检测内存溢出?

时间:2011-11-29 10:34:21

标签: c++ memory

如何检测24/7应用程序(例如在线游戏服务器)中的内存溢出?系统和工具是linux + gcc。

有时,内存溢出的原因是将内存写入数组之外;有时内存溢出的原因是无效指针。

那么,有没有人有这方面的经验并知道如何预防呢?

4 个答案:

答案 0 :(得分:5)

预防(代码级别):

  • 注意编译器的警告
  • 使用静态代码检查器
  • 使用强大的编码指南

检测(在运行时):

答案 1 :(得分:2)

重新定义内存分配函数(例如malloc)以分配比存储分配所需的缓冲区更大的缓冲区,并使用已知模式填充额外空间,并定期检查模式是否已经过损坏。

答案 2 :(得分:2)

正如其他人所说,在测试过程中使用valgrind,并进行详尽的测试。为了在运行时进行保护,可以替换全局operator newoperator delete:替换应该在返回块的两侧保留一个保护块:operator new将保护块初始化为预定义模式,operator delete验证该模式是否仍然存在。 operator delete也应该用一个独特的模式(全0)覆盖实际内存,以增加检测使用悬空指针的概率。

对于所有数组,使用std::vector,尤其是std::vector的调试版本,应该防止所有覆盖,并立即在其发生的位置检测它(如反对当你最终释放记忆时)。但是,在最终应用程序中保留所有检查可能会导致性能下降(但值得一试)。

答案 3 :(得分:1)

使用valgrind's memory check运行程序。

尽可能对代码进行单元测试,然后再使用valgrind's memory check执行。