我把它作为一个班级的私人成员。
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;
答案 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
更清晰,更易读。