如何正确释放 ID3D11ShaderResourceView** 以避免内存泄漏?

How can I properly release a ID3D11ShaderResourceView** to avoid memory leaks?

我把它作为 class 的私有成员。

ID3D11ShaderResourceView** texture_pool;

我在 class 构造函数中将其设置为 NULL,如下所示:

texture_pool = NULL;

然后我在class初始化中这样初始化:

texture_pool = new ID3D11ShaderResourceView*[texture_count];
for (int n = 0; n < texture_count; n++) texture_pool[n] = NULL;

然后在 class 析构函数中,我这样释放它:

for (int n = 0; n < texture_count; n++) SAFE_RELEASE(texture_pool[n]);
SAFE_DELETE_ARRAY(texture_pool);

但有时我的程序在退出时会崩溃,而调试器指向这一行是崩溃的原因:

for (int n = 0; n < texture_count; n++) SAFE_RELEASE(texture_pool[n]);

如果我删除该行,一切都会顺利进行,但我担心如果不释放数组可能会发生内存泄漏。

那么,我是否可以只删除该行,所有内容都会被正确清理?

这些是发布和删除指令的定义行:

#define SAFE_RELEASE(p) { if ( (p) ) { (p)->Release(); (p) = 0; } }
#define SAFE_DELETE(a) if( (a) != NULL ) delete (a); (a) = NULL;
#define SAFE_DELETE_ARRAY(a) if( (a) != NULL ) delete[] (a); (a) = NULL;

你已经展示了这个:

#define SAFE_RELEASE(p) { if ( (p) ) { (p)->Release(); (p) = 0; } }
#define SAFE_DELETE(a) if( (a) != NULL ) delete (a); (a) = NULL;
#define SAFE_DELETE_ARRAY(a) if( (a) != NULL ) delete[] (a); (a) = NULL;

试试这个:

#ifndef SAFE_RELEASE
    #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p) = NULL; } }
#endif

#ifndef SAFE_DELETE
     #define SAFE_DELETE(p) { if(p) { delete (p); (p) = nullptr; } }
#endif

#ifndef SAFE_DELETE_ARRAY
    #define SAFE_DELETE_ARRAY(p) { if(p) { delete[](p); (a) = nullptr; } }
#endif

使用宏时,您需要小心使用“()”和“{}”。

你也不需要 (p) != nullptr 检查,因为当你有 if(p) 它只会执行下一条语句,如果这个检查 returns true 表明指针有效而不是 null .

您还遗漏了宏定义周围的 #ifndef#endif

如果您的编译器不支持 nullptr,那么您可以使用 NULL,但 nullptr 更清晰易读。