Я хотел бы знать, как адаптировать раздел 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)
. Кто-либо может помочь здесь?
Это невозможно. Бьярн считает, что у вас никогда не получится правильно определить правильный пул. Его решение: вы должны вручную вызвать все деструкторы, а затем выяснить правильный пул, чтобы иметь возможность вручную освободить память.
Ссылки:
Часто задаваемые вопросы Бьярна: Есть ли удаление размещения?
Соответствующие стандартные разделы C ++:
3.7.3.2.2 Только функции удаления оператора-члена с аргументом типа size_t рассматриваются для удалить выражения.
5.3.5.1 Синтаксис выражения удаления не допускает дополнительных параметров.
Сначала вызовите dtors для отдельных объектов, а затем используйте:
for (int i = 0; i < 15; ++i) manyFoos[ i ]->~Foo();
operator delete[] (manyFoos, pool);
You можете прочитать весь раздел часто задаваемых вопросов еще раз, и вы найдете его там.