2010-02-24 7 views
8

Mi piacerebbe sapere come adattare lo section 11.14 of the C++-FAQ-lite agli array.Come si dichiara e si utilizza l'eliminazione di un gestore di pool sovraccarico?

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ò aiutare qui?

risposta

1

È impossibile. Bjarne ragiona sul fatto che non riuscirai mai a capire bene la piscina corretta. La sua soluzione è: devi chiamare manualmente tutti i distruttori e quindi capire il pool corretto per poter deallocare la memoria manualmente.

Riferimenti:

frequenti di Bjarne: Is there a placement delete?

Rilevanti C++ standard di sezioni:

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 Eliminare la sintassi delle espressioni non consente parametri aggiuntivi.

2

chiamate le dtors sui singoli oggetti di prima e quindi utilizzare:

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

Si può leggere di nuovo l'intera voce di FAQ e troverete lì.

+0

Scusa, non capisco. In che modo questa affermazione elimina l'array 'manyFoos'? E come sa il compilatore chiamare "operator delete []", non "operator delete"? – Tobias

+0

@Tobias: ho avuto un errore di battitura. Post risolto – dirkgently

+0

@Tobias: quando si utilizza il modulo di posizionamento è necessario eseguire ciò che il compilatore altrimenti fa automaticamente per voi - 1) chiamare il dtor sull'oggetto (i) 2) liberare la memoria. La prima riga di codice si occupa del # 1. Ora, la seconda linea, si occupa di liberare quella parte del 'pool' da cui provengono gli oggetti dell'array. – dirkgently

Problemi correlati