带分配器的第一个计时器。 我真的很挣自定义分配器。 我会说很明显我不知道我在这里做什么。 我的目标是将对象的所有内存都放在进程的堆中。
我希望分配来自系统,因此它不依赖于语言/运行时。 我真的不想要一个结构,我只想要:
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;
}