Как Вы объявляете и используете перегруженный оператор пула, удаляют?

Я хотел бы знать, как адаптировать раздел 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). Кто-либо может помочь здесь?

8
задан Unihedron 16 December 2014 в 17:16
поделиться

2 ответа

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

Ссылки:

Часто задаваемые вопросы Бьярна: Есть ли удаление размещения?

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

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

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

1
ответ дан 6 December 2019 в 00:55
поделиться

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

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

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

2
ответ дан 6 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: