你可以使用一个模板:
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