C# 跟踪GPU内存泄漏的专业方法(分配而不释放)

C# 跟踪GPU内存泄漏的专业方法(分配而不释放),c#,c++,memory,memory-management,memory-leaks,C#,C++,Memory,Memory Management,Memory Leaks,我正在寻找如何在源代码中跟踪GPU内存泄漏来源的建议 我有一个大的多线程的C/C++应用程序,当一些特定的动作重复时,它会遇到内存不足的但很小的问题。我也有运行在这个应用程序旁边的内存扫描程序,所以我可以实时跟踪内存使用统计数据。因为我知道哪些操作会导致内存使用量的增长,所以我能够概括出这些坏事情发生的代码框架。接下来,我在这些帧中放置断点,附加调试器,并逐步检查内存使用峰值。我想跟踪内存被分配但从未释放的区域,从而导致泄漏 我的调查方法真的很糟糕(同时由于代码的复杂性和多线程的影响,这也很困难

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

我有一个大的多线程的C/C++应用程序,当一些特定的动作重复时,它会遇到内存不足的但很小的问题。我也有运行在这个应用程序旁边的内存扫描程序,所以我可以实时跟踪内存使用统计数据。因为我知道哪些操作会导致内存使用量的增长,所以我能够概括出这些坏事情发生的代码框架。接下来,我在这些帧中放置断点,附加调试器,并逐步检查内存使用峰值。我想跟踪内存被分配但从未释放的区域,从而导致泄漏


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

我使用了一些工具,但是我发现下面提供了一套最简洁的工具来满足我的需要,也许它们会适合你的需要:

  • 来自AMD的CodeXL:
  • Nvidia NSight:
  • Nvidia可视档案器:
  • 格德布格:
根据我正在做的事情以及我需要跟踪/跟踪和配置的内容,我使用上述所有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++的语言来的,它需要一段时间才能习惯,但很快就会变成习惯: