当我在另一个函数中使用它们时,是否需要在D3D对象上调用Release()?

例如,我有一个IDirect3DSurface9 * SurfaceIDirect3DSurface9 *BackBuffer

如果我直接在render_frame函数中使用它们,我需要在closeD3D函数中释放它们。 但是,如果我在同一个文件或另一个.h和.cpp文件中的函数中使用它们,当我在closeD3D调用Release ,它会给我一个错误。

所以,如果我在函数中使用它们,我不需要释放它们,还是我做错了什么?

您是否应该在D3D对象上调用Release的规则很简单:

这是你的责任, 平衡你的调用function,增加引用计数与减less引用计数。 例如,显式调用AddRef ,应该通过在完成引用时调用Release来进行平衡。

大多数从某处创建或获取资源的函数隐含地增加了引用计数,这意味着当您完成对对象的引用时,应该调用Release 。 给定函数的文档将会注意到它是否不增加引用计数。

无论对象在其中创建或使用的function如何,这些规则都适用。 它们更多的是关于程序的更高层次的语义:通常如果你在启动函数中分配了一堆资源,你应该在匹配的closures函数中清理这些资源(调用Release )。 但是如果你在一个特定的函数中暂时分配或者获取一个资源,你应该在该函数中释放它,除非你知道你的代码库中的另一个匹配函数能够安全地释放资源。

如果在移动版本调用时出现“错误”,则可能不平衡添加/版本引用计数对。 或者你有另一种错误。 无论哪种方式,“debugging我的代码”的问题在这里都是无关紧要的,所以你需要使用老式的解决问题的手段:debugging器。