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;
}

0 ответов

Другие вопросы по тегам