Come si fa a dichiarare ed utilizzare un operatore sovraccaricato piscina cancellare?
-
22-09-2019 - |
Domanda
Mi piacerebbe sapere come adattare sezione 11.14 di il C ++ - FAQ-lite ad array
.In sostanza, vorrei qualcosa di simile:
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;
}
Tuttavia, non sono stato in grado di capire la sintassi corretta per dichiarare e chiamare questo operator delete[] (pool)
. Qualcuno può aiutarmi qui?
Soluzione 2
E 'impossibile. ragioni Bjarne che non avrai mai farlo bene capire la piscina corretta. La sua soluzione è:. È necessario chiamare manualmente tutti i distruttori e quindi capire la piscina corretto per essere in grado di rilasciare la memoria manualmente
References:
FAQdi Bjarne: C'è un collocamento eliminare
Relevant C ++ sezioni standard:
3.7.3.2.2 unico operatore membro cancellare le funzioni con un argomento di tipo size_t sono considerati per le espressioni di eliminazione.
5.3.5.1 Sintassi delete espressione non consente parametri extra.
Altri suggerimenti
Chiama i dtors sui singoli oggetti e poi usare:
for (int i = 0; i < 15; ++i) manyFoos[ i ]->~Foo();
operator delete[] (manyFoos, pool);
È possibile leggere l'intero articolo FAQ di nuovo e lo troverete lì.