如何正确释放 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
更清晰易读。
我把它作为 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
更清晰易读。