Cpp Custom STD Распределитель
Первый таймер с распределителем. Я действительно борюсь с пользовательским распределителем. Я бы сказал, это очевидно, я не знаю, что я здесь делаю. Моя цель - поместить всю память для объекта в кучу процесса.
Я хочу, чтобы распределение происходило из системы, поэтому оно не зависит от языка / времени выполнения. Я не очень хочу структуру, я просто хочу:
std::list< WCHAR[SIZE], TestAllocator<WCHAR[SIZE]>> list;
или я бы выделил память вне списка, а затем просто сохранил указатель на него
std::list< void*, TestAllocator<void*>> list;
Но я не вижу, как это сделать с неструктурами / классами. Итак, у меня есть структура. Эта вещь разбивается повсюду. Приведенный ниже код, который создает экземпляр списка, дает сбой, ему даже не нужно переходить к созданию / вставке элемента списка.
Распределитель используется для создания списка, прежде чем я пытаюсь добавить элемент. (что я не понимаю.) Мне кажется, что распределитель должен использоваться только для типа структуры, которую я пытаюсь добавить в список. Если распределитель используется для создания списка и элементов, которые он содержит, как мне создать память для двух разных типов, типа списка и типа записи списка?
Некоторые другие наблюдения / вопросы. Когда мой список создан, он помещается в созданный адрес памяти:
OSAllocator:: allocate count: [1] байтов каждый:[8][0x8] всего байт:[8][0x8] addr: [4305640] [0x41B2E8] OSAllocator:: разместить конструкцию new: [4305640] [0x41B2E8] sizeof (Val):[8][0x8]
Однако, когда моя запись создана, она помещается на 2 байта после созданного адреса:
OSAllocator:: allocate count: [1] байтов каждый:[8200][0x2008] общее количество байтов:[8200][0x2008] addr: [8837144] [0x86D818] OSAllocator:: размещение конструкции new: [8837152] [0x86D820] sizeof (Val):[8192][0x2000]
Есть ли объяснение этому?
Пожалуйста, помогите указать, что мне не хватает.
Благодарю.
// allocator...
pointer allocate(size_type size, TestAllocator<void>::const_pointer hint = 0)
{
pointer p = (pointer)::HeapAlloc( ::GetProcessHeap(),
HEAP_ZERO_MEMORY | HEAP_NO_SERIALIZE,
size*sizeof(T) );
gCountAllocate++;
if( OSAllocatorConsole )
wprintf( L"OSAllocator::allocate: [%u][0x%X]\n", p, p );
return p;
}
size_type max_size() const throw() {return size_t(-1) / sizeof(value_type);}
void construct(pointer p, const T& val)
{
gCountConstructPlaceNew++;
if( OSAllocatorConsole )
wprintf( L"OSAllocator::construct placement new:[%u][0x%X]\n", p, p );
::CopyMemory( p, &val, sizeof(val) );
}
typedef struct _LogLine
{
WCHAR _logLine[4*1024];
} LOGLINE, *PLOGLINE;
DWORD TestAllocatorChar(int argc, WCHAR* argv[])
{
WCHAR buf[32] = {0};
DWORD total = 1;
std::list< LOGLINE, TestAllocator<LOGLINE>> list;
PLOGLINE pll = NULL;
LOGLINE ll = {0};
for(int i=0; i<total; i++ )
{
::StringCchPrintfW( ll._logLine, 4*1024, L"count:[%u]", i );
list.push_back( ll );
}
for( int i=0; i<total; i++ )
{
//pll = list.front();
wprintf( L"%s\n", list.front()._logLine );
wprintf( L"HeapFree item:[%u]\n", i );
//::HeapFree( ::GetProcessHeap(), HEAP_NO_SERIALIZE, p );
list.pop_front();
}
return 0;
}