Listing 2a: Definition of class CThreadPrivateHeapAllocated

#include <windows.h>

class CThreadPrivateHeapAllocated {
public:

   virtual ~CThreadPrivateHeapAllocated() = 0; 

   void* operator new( size_t size )
      { return alloc( size ); }

   void* operator new[]( size_t size )
      { return alloc( size ); }

   void   operator delete( void* p )
      { dealloc( p ); }
            
   void operator delete[]( void* p )
      { dealloc( p ); }

   static void SetTlsIndex( DWORD dwIndex )
      { m_dwTlsIndex=dwIndex; }
                         
   static DWORD GetTlsIndex() 
      { return m_dwTlsIndex; }
                         
protected:
   static inline void* alloc( size_t size );
   static inline void dealloc( void* p );
   static DWORD m_dwTlsIndex;
};

inline void* CThreadPrivateHeapAllocated::alloc( size_t size )
{
   #ifdef _DISABLE_PRIVATE_THREAD_HEAPS
      return ::operator new( size ); 
   #else
      HANDLE hHeap = ::TlsGetValue( m_dwTlsIndex ); 
      return ::HeapAlloc( hHeap, HEAP_NO_SERIALIZE, size );
   #endif
}

inline void CThreadPrivateHeapAllocated::dealloc( void* p )
{
   #ifdef _DISABLE_PRIVATE_THREAD_HEAPS
      ::operator delete( p );
   #else
      HANDLE hHeap = ::TlsGetValue( m_dwTlsIndex ); 
      ::HeapFree( hHeap, HEAP_NO_SERIALIZE, p );
   #endif
}