2010-02-24 2 views
8

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

ответ

1

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

Ссылка:

Бьярня часто задаваемые вопросы: Is there a placement delete?

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

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

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

2

Вызовите dtors на отдельные объекты, а затем использовать:

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

Вы можете прочитать весь пункт FAQ снова, и вы найдете его там.

+0

Извините, я не понимаю. Как этот оператор удаляет массив 'manyFoos'? И как компилятор знает, чтобы вызвать 'operator delete []', а не 'operator delete'? – Tobias

+0

@Tobias: У меня была опечатка. Фиксированная почта. – dirkgently

+0

@Tobias: При использовании формы размещения вам нужно сделать то, что компилятор в противном случае сделает для вас автоматически - 1) вызвать dtor для объекта (ов) 2) освободить память. Первая строка кода заботится о # 1. Теперь вторая строка позаботится о том, чтобы освободить ту часть пула, откуда пришли ваши объекты массива. – dirkgently

 Смежные вопросы

  • Нет связанных вопросов^_^