Как вы объявляете и используете перегруженный пул оператора delete? - PullRequest
8 голосов
/ 24 февраля 2010

Я хотел бы знать, как адаптировать раздел 11.14 C ++ - FAQ-lite к массивам.

В принципе, я бы хотел что-то вроде этого:

class Pool {
public:
  void* allocate(size_t size) {...}
  void deallocate(void* p, size_t size) {...}
};

void* operator new[](size_t size, Pool& pool) { return pool.allocate(size); }
void operator delete[](void* p, size_t size, Pool& pool) { pool.deallocate(p, size); }

struct Foo {...};

int main() {
  Pool pool;

  Foo* manyFoos = new (pool) Foo [15];

  /* ... */

  delete [] (pool) manyFoos;
}

Однако я не смог выяснить правильный синтаксис для объявления и вызова этого operator delete[] (pool). Кто-нибудь может здесь помочь?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Сначала вызовите dtors для отдельных объектов, а затем используйте:

for (int i = 0; i < 15; ++i) manyFoos[ i ]->~Foo();
operator delete[] (manyFoos, pool);

Вы можете снова прочитать весь раздел часто задаваемых вопросов и найти его там.

1 голос
/ 24 февраля 2010

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

Ссылки:

Bjarne's FAQ: Есть ли место размещения удалить?

Соответствующие стандартные разделы C ++:

3.7.3.2.2 Для выражений удаления рассматриваются только функции удаления операторов-членов с аргументом типа size_t.

5.3.5.1 Синтаксис удаления выражения не допускает дополнительных параметров.

...