有很多方法可以检查程序的内存泄漏。你最终会得到那个泄漏内存块的指针列表,但有没有一种好的方法可以找到每个块的更多信息?例如:如果我知道对象是一个字符串,实际的字符串值可能会让查找泄漏变得更容易。
有一个后门进入RTTI使得这种可能吗?
需要解决的问题是,当你获取指针时,运行时系统已经处于关闭状态,并且你得到的是原始内存块指针而不是对象指针(虽然在许多情况下它们可能是相同的)。
有很多方法可以检查程序的内存泄漏。你最终会得到那个泄漏内存块的指针列表,但有没有一种好的方法可以找到每个块的更多信息?例如:如果我知道对象是一个字符串,实际的字符串值可能会让查找泄漏变得更容易。
有一个后门进入RTTI使得这种可能吗?
需要解决的问题是,当你获取指针时,运行时系统已经处于关闭状态,并且你得到的是原始内存块指针而不是对象指针(虽然在许多情况下它们可能是相同的)。
RTTI可能不会对您有帮助。RTTI只有在类具有虚方法时才起作用,并且并非所有的分配都是具有虚方法的对象。
你真正需要做的是找到一种方法将堆栈跟踪与你的分配相关联。这样,你就可以获得有关内存分配的信息。如果内存泄漏是由对象引起的,你应该查找类的构造函数。
无论如何,类似这样的东西存在吗?是的,在Windows上有一个免费的库,名叫Visual Leak Detector。还有更全面的商业产品(如Bounds Checker和IBM的Rational Purify),但VLD效果非常好。它帮助我无数次发现内存泄漏。
我使用valgrind --leak-check=full命令,它将给我每个泄漏块的分配位置的堆栈跟踪。这些信息比仅仅提供类型信息要有用得多。 Valgrind(发音类似于“Val grinned”)太棒了!
like norman i advocate for valgrind. It is really a good advice for analyzing the stack trace!
我在KDevelop中使用它构建。