MemoryGuared

公開:2009-10-11 08:02
更新:2020-02-15 04:36
カテゴリ:windows

IMMDeviceGetId( LPWSTR *ppstrId)で、デバイスIDの文字列が取得できるのだが、この文字列はOSでアロケートされたメモリに格納されるので、不要になったらCoTaskMemFree()しなくてはならない。
こういうのは忘れやすい僕にとっては危険な仕様なので、ラッパクラスを作って確実に解放するようにしたい。
すこしググってみたらやっぱり同じことを考えている人がいて、ポリシーベースの立派なものがすでに作られていたので、早速拝借することにする。

<元ネタ>https://forums.codegear.com/thread.jspa?messageID=97614&#97614

namespace sf
{
// policy class
struct HeapMemoryFreePolicy
{
template< typename T >
void operator()( const T* AMemory ) const
{
if( NULL != AMemory )
::HeapFree( ::GetProcessHeap(), 0, AMemory );
}
};
// policy class
struct LocalMemoryFreePolicy
{
template< typename T >
void operator()( const T* AMemory ) const
{
if( NULL != AMemory )
::LocalFree( AMemory );
}
};
// policy class
struct CoTaskMemoryFreePolicy
{
template< typename T >
void operator()( const T* AMemory ) const
{
if( NULL != AMemory )
::CoTaskMemFree( AMemory );
}
};
// base guard class
template< typename T,
class TFreePolicy
class BaseMemory
{
private:
T *FMemory;
public:
BaseMemory( T* AMemory = NULL )
: FMemory( AMemory ) {}
virtual ~BaseMemory( void )
{ Reset(); }
T* Release( void )
{
T *tmp = FMemory;
FMemory = NULL;
return tmp;
}
void Reset( T* AMemory = NULL )
{
if( AMemory != FMemory )
{
if( NULL != FMemory )
TFreePolicy( FMemory );
FMemory = AMemory;
}
}
T* Get( void )
{ return FMemory; }
T** operator&( void )
{ return &FMemory; }
};
template< typename T >
class HeapMemory : public BaseMemory< T,
HeapMemoryFreePolicy >
{
public:
HeapMemory( T* AMemory = NULL )
: BaseMemory< T, HeapMemoryFreePolicy >( AMemory )
{ }
};
template< typename T >
class LocalMemory : public BaseMemory< T,
LocalMemoryFreePolicy >
{
public:
LocalMemory( T* AMemory = NULL )
: BaseMemory< T, LocalMemoryFreePolicy >( AMemory )
{ }
};
template< typename T >
class CoTaskMemory : public BaseMemory< T,
CoTaskMemoryFreePolicy >
{
public:
CoTaskMemory( T* AMemory = NULL )
: BaseMemory< T, CoTaskMemoryFreePolicy >( AMemory )
{ }
};
} // end namespace sf