Это мой сценарий, я пытаюсь перегрузить новые и удалить глобально. Я написал свой класс распределителя в файле с именем allocator.h. И чего я пытаюсь добиться, так это того, что если файл включает этот заголовочный файл, следует использовать мою версию new и delete.
Итак, в заголовочном файле "allocator.h" я объявил две функции
extern void* operator new(std::size_t size);
extern void operator delete(void *p, std::size_t size);
В том же заголовочном файле у меня есть класс, который выполняет все действия распределителя,
class SmallObjAllocator
{
...
};
Я хочу вызвать этот класс из функций создания и удаления, и я хотел бы, чтобы класс был статическим, поэтому я сделал это:
template<unsigned dummy>
struct My_SmallObjectAllocatorImpl
{
static SmallObjAllocator myAlloc;
};
template<unsigned dummy>
SmallObjAllocator My_SmallObjectAllocatorImpl<dummy>::myAlloc(DEFAULT_CHUNK_SIZE, MAX_OBJ_SIZE);
typedef My_SmallObjectAllocatorImpl<0> My_SmallObjectAllocator;
а в файле cpp это выглядит так: allocator.cc
void* operator new(std::size_t size)
{
std::cout << "using my new" << std::endl;
if(size > MAX_OBJ_SIZE)
return malloc(size);
else
return My_SmallObjectAllocator::myAlloc.allocate(size);
}
void operator delete(void *p, std::size_t size)
{
if(size > MAX_OBJ_SIZE)
free(p);
else
My_SmallObjectAllocator::myAlloc.deallocate(p, size);
}
Проблема в том, что когда я пытаюсь вызвать конструктор класса SmallObjAllocator, который является статическим объектом. По какой-то причине компилятор вызывает мою перегруженную функцию новой при ее инициализации. Затем он пытается использовать My_SmallObjectAllocator::myAlloc.deallocate(p, size); который не определен, поэтому программа вылетает.
Так почему же компилятор вызывает new, когда я определяю статический объект? и как я могу это решить?
My_SmallObjectAllocator<1>
в какой-то момент в будущем и получить второй распределитель. - person Dennis Zickefoose   schedule 06.05.2010SmallObjectAllocator
? - person Dennis Zickefoose   schedule 06.05.2010