|
Этот класс (Class Dynamic Array) позволяет создавать массивы любых
типов данных с динамическим выделением памяти. Он очень прост и
обладает минимальной функциональностью, которой, однако, хватает
для выполнения определенных задач. Память выделяется по мере надобности,
освобождается же вся сразу.
template <class TYPE>
class CDA{
public:
BOOL Alloc( DWORD dwSize );
void Decommit(){ VirtualFree( m_pArray, 0, MEM_DECOMMIT ); }
void Release(){ VirtualFree( m_pArray, 0, MEM_RELEASE ); }
TYPE &operator[]( DWORD dwIndex );
private:
TYPE *m_pArray;
DWORD m_dwArraySize;
};
Резервирование региона:
template <class TYPE>
BOOL CDA<TYPE>::Alloc( DWORD dwSize )
{
m_dwArraySize = dwSize;
m_pArray = (TYPE*) VirtualAlloc( NULL, sizeof( TYPE ) * m_dwArraySize,
MEM_RESERVE | MEM_TOP_DOWN, PAGE_READWRITE );
return ( m_pArray != NULL ) ? TRUE : FALSE;
}
Выделение физической памяти для элемента и возврат его адреса:
template <class TYPE>
TYPE &CDA<TYPE>::operator[]( DWORD dwIndex )
{
if( dwIndex > ( m_dwArraySize - 1 ) ) dwIndex = m_dwArraySize - 1;
__try{
TYPE t;
CopyMemory( &t, &m_pArray[dwIndex], sizeof( TYPE ) );
}
__except( ( GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ) ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ){
VirtualAlloc( &m_pArray[dwIndex], sizeof( TYPE ), MEM_COMMIT, PAGE_READWRITE );
}
return m_pArray[dwIndex];
}
CDA <DWORD> dwARRAY;
dwARRAY.Alloc( 1000000 );
dwARRAY[1] = 1;
dwARRAY[10000] = 10000;
dwARRAY[100000] = 100000;
dwARRAY.Release();
|