вызывающий оператор класса новый - PullRequest
3 голосов
/ 21 июня 2010

Выражение operator new(sizeof(T)) выделяет T байтов через ::operator 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 В противном случае

Ответы [ 2 ]

1 голос
/ 21 июня 2010

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

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

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

0 голосов
/ 21 июня 2010

Определите отличную статическую функцию 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...