cpp custom std allocator

时间:2015-04-07 12:44:15

标签: c++ allocator

带分配器的第一个计时器。 我真的很挣自定义分配器。 我会说很明显我不知道我在这里做什么。 我的目标是将对象的所有内存都放在进程的堆中。

我希望分配来自系统,因此它不依赖于语言/运行时。 我真的不想要一个结构,我只想要:

std::list< WCHAR[SIZE], TestAllocator<WCHAR[SIZE]>> list;

或者,我将内存分配到列表之外,然后只存储指向它的指针

std::list< void*, TestAllocator<void*>> list;

但我不知道如何使用非struct / classes。所以我有一个结构。 这件事在整个地方都崩溃了。 下面的代码实例化列表崩溃,它甚至不必进入列表项创建/插入。

在尝试添加项目之前,分配器用于创建列表。 (我不明白。)在我看来,分配器只应该用于尝试添加到列表中的结构类型。如果分配器用于创建列表及其拥有的项目,如何为2种不同类型创建内存,列表类型和列表条目类型?

其他一些意见/问题。 创建列表后,它将被放置在创建的内存地址:

OSAllocator :: allocate count:[1] bytes each:[8] [0x8] bytes total:[8] [0x8] addr:[4305640] [ 0x41B2E8 ] OSAllocator ::构造贴图新:[4305640] [ 0x41B2E8 ] sizeof(val):[8] [0x8]

但是,当我的条目被创建时,它被放置在创建的地址之后2个字节:

OSAllocator :: assign count:[1] bytes each:[8200] [0x2008] bytes total:[8200] [0x2008] addr:[8837144] [ 0x86D818 ] OSAllocator :: construct placement 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 个答案:

没有答案