【问题标题】:What happens when you leak a "device" and "device context" - specifically d3d?当您泄漏“设备”和“设备上下文”时会发生什么 - 特别是 d3d?
【发布时间】:2015-09-16 04:22:34
【问题描述】:

我不太清楚这些对象是如何在软件和硬件之间形成桥梁的。如果您在终止进程时将它们泄漏到堆上,它们几乎只是被破坏的软件对象吗?还是有更多的东西?

我问的原因是我忘记让我的初始化例程更改其状态机,因此切换例程导致它尽可能多地创建“DeviceContexts”和“Devices”并将它们重新分配给相同的指针(通过 d3d11createdevice)在我发现我的内存泄漏到大约 2GB 之前。

然后我突然想到,我真的不知道未能释放这些对象意味着什么。如果这些对象被泄露以致我需要重置我的计算机,我是否应该关注它们的硬件组件?还是终止进程几乎可以清理混乱?

为了确定,我冷重置了我的电脑。但是,如果您使用这样的低级接口并且未能正确销毁/释放它们,那么确切地知道会发生什么会很好。

【问题讨论】:

  • 当您的程序终止时,操作系统将清除所有这些设备上下文。否则,行为不端的程序可能会导致系统停止。
  • 所以我真的不必担心这些东西会以任何方式造成硬件损坏?我知道这似乎是一个愚蠢的问题 - 但我真的不了解设备驱动程序。
  • 使用它们应该不会损坏硬件,也不必担心。

标签: c++ memory-leaks direct3d device-driver


【解决方案1】:

当您的程序终止时,操作系统将清除所有这些设备上下文。否则,行为不端的程序可能会导致系统停止运行。

您对损坏硬件的其他担忧(在评论中表达)也不应该是可能的。如果它是一个恶意程序,可能会造成各种破坏。直接访问硬件可能会损坏硬件,但这种访问是驱动程序(以及位于程序和驱动程序之间的设备上下文)的用途。

【讨论】:

  • “泄漏”COM 对象的主要问题是,如果您有很多无关紧要的泄漏,那么很难找到真正重要的泄漏。干净地存在内存和 COM 对象通常是一种好习惯,因为这样可以在出现严重泄漏时发现它们。也就是说,它不会伤害系统......只是有问题的应用程序。
  • 对于 COM 对象,使用像 Microsoft::WRL::ComPtr 这样的 C++ 智能指针是自动清理 Direct3D 对象的好方法。
  • @ChuckWalbourn 是的,我并没有忽略泄漏——这只是一个错误,我错过了在 init 循环中插入退出点,这导致了 2GB 的泄漏设备和上下文。我不确定在进程本身终止后这是否真的很危险——是否可能存在与 GPU 的连接不会被释放,因为我从未告诉 GPU 释放它们或其他什么。
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 2011-02-23
  • 2018-12-07
  • 2012-06-13
  • 2011-03-28
  • 1970-01-01
  • 2014-05-09
  • 2011-08-20
相关资源
最近更新 更多