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

时间:2015-09-29 21:26:31

标签: c++ directx release

我把它作为一个班级的私人成员。

ID3D11ShaderResourceView** texture_pool;

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

texture_pool = NULL;

然后我在类初始化中将它初始化为:

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

在类析构函数中,我将其释放出来:

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

但有时当我退出它时,我的程序崩溃,并且此行的debbuger指向崩溃的原因:

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;

1 个答案:

答案 0 :(得分:1)

你已经证明了这一点:

#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

使用宏时,您需要小心使用&#34;()&#34; &安培; &#34; {}&#34 ;.

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

您还错过了宏定义周围的#ifndef#endif

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