你可以使用一個模板:
template<class DXInterface>
void SafeRelease(DXInterface **ppInterface) {
if(*ppInterface) {
(*ppInterface)->Release();
(*ppInterface) = nullptr;
}
}
你也可以使用一個std ::的unique_ptr或std :: shared_ptr的自動清理:
#include <memory>
#include <iostream>
struct Releaser {
template<class DXInterface>
void operator()(DXInterface *pInterface) const {
if(pInterface) {
pInterface->Release();
}
}
};
// For illustrative purposes only (supplied in DX9 headers)
struct IDirect3DSurface9 { void Release() { std::cout << "Released surface\n";} };
struct IDirect3DTexture9 { void Release() { std::cout << "Released texture\n";} };
void DX9CreateSurface(IDirect3DSurface9** surface)
{
*surface = new IDirect3DSurface9();
}
void DX9CreateTexture(IDirect3DTexture9** texture)
{
*texture = new IDirect3DTexture9();
}
// Your factory functions
IDirect3DSurface9* createSurface(/*init params go here*/)
{
IDirect3DSurface9* surface;
DX9CreateSurface(&surface);
return surface;
}
IDirect3DTexture9* createTexture(/*init params go here*/)
{
IDirect3DTexture9* texture;
DX9CreateTexture(&texture);
return texture;
}
int main()
{
typedef std::unique_ptr<IDirect3DSurface9, Releaser> SurfacePtr;
typedef std::unique_ptr<IDirect3DTexture9, Releaser> TexturePtr;
SurfacePtr surface(createSurface());
TexturePtr texture(createTexture());
// ... use surface and texture here
// Automatically released here when their lifetimes ends.
}
注意,他們使用相同的釋放器,並注意到對surface.reset()的調用也會釋放該接口,並將unique_ptr中的指針設置爲null以引導。這兩個對象可以是你的類的成員,而不是main()中的對象。
是否有創建這樣一個函數的原因,而不是使用'ComPtr'? – Duncan