Оператор замены new / delete в производном классе

У меня есть абстрактный базовый класс без состояния, от которого наследуются различные конкретные классы. Некоторые из этих производных классов также не имеют состояния. Поскольку многие из них создаются во время выполнения, я хотел бы сэкономить память и накладные расходы, заставив все производные классы без сохранения состояния эмулировать синглтон путем переопределения оператора new () / delete (). Упрощенный пример будет выглядеть примерно так:

#include <memory>

struct Base {
  virtual ~Base() {}
 protected:
  Base() {}   // prevent concrete Base objects
};

struct D1 : public Base {  // stateful object--default behavior
  int dummy;
};

struct D2 : public Base {  // stateless object--don't allocate memory
  void* operator new(size_t size)
  {
    static D2 d2;
    return &d2;
  }
  void operator delete(void *p) {}
};

int main() {
  Base* p1 = new D1();
  Base* p2 = new D1();
  Base* s1 = new D2();
  Base* s2 = new D2();
  delete p1;
  delete p2;
  delete s1;
  delete s2;
  return 0;
}

Этот пример не работает: удалить s2; не работает, потому что удаляет s1; вызывает ~ Base () , что освободило общую базу в d2 . Это можно решить, добавив тот же трюк с перегрузкой new / delete в Base. Но я не уверен, что это самое чистое решение или даже правильное (valgrind не жалуется, FWIW). Буду признателен за совет или критику.

edit: на самом деле ситуация еще хуже. Как я утверждал, базовый класс в этом примере не является абстрактным. Если он сделан абстрактным путем добавления чистого виртуального метода, то я больше не смогу применять трюк переопределения new / delete, потому что у меня не может быть статической переменной типа Base. Итак, у меня нет решения этой проблемы!

6
задан Eitan 22 June 2011 в 05:12
поделиться