跟踪GPU内存泄漏的专业方法(无需释放的分配)

时间:2014-03-18 10:18:01

标签: c# c++ memory memory-management memory-leaks

我正在寻找如何跟踪源代码中的GPU内存泄漏来源的建议。

我有一个庞大的多线程c#/ c ++应用程序,当重复某些特定操作时,它会遇到小而确定的内存泄漏问题。我还在此应用程序旁边运行了内存扫描程序,因此我可以实时跟踪内存使用情况统计信息。因为我知道哪些操作负责内存使用增长,所以我能够概述出现这些不良事件的代码框架。接下来,我在这些帧中放置断点,附加调试器,并逐步检查内存使用峰值。我想跟踪分配内存但从未释放的区域,从而导致泄漏。

我的调查方式非常糟糕(由于代码复杂性和多线程播放,同时也很难)。有没有专业的方法来跟踪和解决这样的问题?

1 个答案:

答案 0 :(得分:2)

我使用了一小部分工具,但是我发现以下内容可以提供最简洁的工具来满足您的需求,也许它们适合您的工具:

根据我正在做什么以及我需要跟踪/跟踪和配置文件,我使用上面的所有4个包。他们还有一个额外的好处:免费; b:维护得很好; c:免费; d:定期更新; e:免费。

如果您没有猜到我喜欢免费部分:)

关于对象管理,我建议使用旧的C ++编码原则:只要创建一个对象,添加删除它的行,每个新的应始终(最终)删除。这样你就知道你正在销毁你创建的对象,但它不会从孤立的内存块内存泄漏中拯救你,你可以在这里更改指针的位置,例如:

myclass* firstInstance = new myclass();
myclass* secondInstance = new myclass();
firstInstance = secondInstance;
delete firstInstance;
delete secondInstance;

您现在将创建一个小内存泄漏,其中任何指针现在都没有指向真正的firstInstance的数据。很难在大型代码库中发现这种情况,并且应该更常见。

通常这些是您需要注意的配对,以确保您正确处理所有对象:

new -> delete
new[] -> delete[]
malloc() -> free() // or you can use realloc(0) instead of free()
calloc() -> free() // or you can use realloc(0) instead of free()
realloc(nonzero) -> free() // or you can use realloc(0) instead of free()

如果您使用垃圾收集语言来到C ++,可能需要一段时间才能习惯,但很快就会成为习惯:)