2010-06-21 3 views
3

Выражение operator new(sizeof(T)) выделяет T байт через ::operator new, правильно?вызов оператора класса-класса new

Есть ли способ вызвать версию класса-специфичный operator new, если она существует, именно так, как new T() выделяемой памяти (перед вызовом конструктора)?

T::operator new(sizeof(T)) дает ошибку во время компиляции, если T не определяет operator new, даже если T наследуется от базового класса, который определяет его. То, что я хотел бы назвать это:

  • Foo::operator new если Foo определяет operator new
  • Base::operator new если Foo происходит от Base, что определяет operator new (то, что мне делать множественное наследование?)
  • ::operator new иначе
+0

Зачем вам это нужно явно? Если оператор 'new' перегружен для класса, компилятор будет использовать его всякий раз, когда вы создаете экземпляр этого объекта с помощью' new ClassName'. –

+0

@Ama: Потому что я не хочу создавать объекты. Я хочу только память, поэтому я могу использовать новое место размещения в более поздний момент времени. – fredoverflow

+0

Можете ли вы объяснить, чего вы пытаетесь достичь? Разумеется, если вы отделяете выделение памяти от конструкции объекта, вы можете выделить память так, как хотите? Зачем вам выделять память так же, как 'new T'? –

ответ

1

Стандартная библиотека решает эту проблему, используя объект, тип которого распределитель устанавливаются в качестве параметра шаблона класса, который нуждается в алгоритме настраиваемого распределения.

Я не думаю, что есть какой-либо полный способ сделать то, что вы просили, о чем уже свидетельствует ваша вторая пуля. Компилятору не удастся узнать, какой новый оператор родителя использовать, если они оба определили его.

Если вы пытаетесь реализовать, например, небольшой пул распределения объектов, который выбирает соответствующий размер/пул во время компиляции, что же касается использования автономной функции распределения шаблонов: он будет называться примерно как object_allocator<T>::allocate(), а тип шаблона будет позвольте вам выяснить размер автоматически. Вы по-прежнему не можете наследовать оператора new из-за проблемы множественного наследования, но это позволяет легко определить, как распределять память в любом классе.

0

Определите отличную статическую функцию allocate и вызовите эту функцию от T::operator new

class X { 
public: 
    static void * allocate(size_t size) { 
      //... 
    } 
    void *operator new(size_t size) { 
     return allocate(size); 
    } 
}; 

void f() { 
    void * p = X::allocate(sizeof(X)); 
    X * x = new(p) X; 
} 
+0

Это решение слишком навязчивое для моего вкуса :( – fredoverflow

Смежные вопросы