перегрузка нового/удаления проблемы

Это мой сценарий, я пытаюсь перегрузить новые и удалить глобально. Я написал свой класс распределителя в файле с именем 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, когда я определяю статический объект? и как я могу это решить?


person hidayat    schedule 06.05.2010    source источник
comment
Я не понимаю цели конструкции шаблона. Почему бы не сделать SmallObjAllocator синглтоном и не создать объект в allocator.cc?   -  person Michael Ulm    schedule 06.05.2010
comment
Предположительно, он хочет сделать My_SmallObjectAllocator<1> в какой-то момент в будущем и получить второй распределитель.   -  person Dennis Zickefoose    schedule 06.05.2010
comment
Что происходит в конструкторе SmallObjectAllocator?   -  person Dennis Zickefoose    schedule 06.05.2010
comment
Я думаю, что единственный способ решить эту проблему - не использовать шаблон и использовать синглтон.   -  person hidayat    schedule 06.05.2010


Ответы (1)


Вы не можете использовать глобальный operator new библиотеки времени выполнения, если вы предоставляете свой собственный. Таким образом, вы не можете использовать new для реализации new даже при инициализации. Использование разных operator new в разных исходных файлах является нарушением правила единого определения.

Удалите вызов new из конструктора SmallObjAllocator::SmallObjAllocator или реализуйте особый случай, активируемый глобальным bool new_uninitialized или локальным флагом static bool new_is_recursing.

person Potatoswatter    schedule 06.05.2010