2010-02-24 11 views
8

Me gustaría saber cómo adaptar section 11.14 of the C++-FAQ-lite a las matrices.¿Cómo declaras y utilizo la eliminación de un operador de la piscina sobrecargado?

Básicamente, me gustaría que algo como esto:

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; 
} 

Sin embargo, no he sido capaz de averiguar la sintaxis correcta para declarar y llamar a este operator delete[] (pool). ¿Alguien puede ayudar aquí?

Respuesta

1

Es imposible. Bjarne razona que nunca lo harás bien averiguando el grupo correcto. Su solución es: debe llamar manualmente a todos los destructores y luego descubrir el grupo correcto para poder desasignar la memoria manualmente.

Referencias:

de Bjarne FAQ: Is there a placement delete?

secciones pertinentes de C++ estándar:

3.7.3.2.2 único operador miembro de borrar funciones con un argumento de tipo size_t se consideran las expresiones de borrado.

5.3.5.1 Eliminar la sintaxis de la expresión no permite parámetros adicionales.

2

llamadas las dtors sobre los objetos individuales, luego utilice:

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

Usted puede leer el artículo entero FAQ de nuevo y lo encontrará allí.

+0

Lo siento, no lo entiendo. ¿Cómo esta declaración elimina la matriz 'manyFoos'? ¿Y cómo sabe el compilador llamar 'operator delete []', not 'operator delete'? – Tobias

+0

@Tobias: tuve un error tipográfico. Publicación fija. – dirkgently

+0

@Tobias: cuando utiliza el formulario de ubicación, necesita hacer lo que el compilador hace por usted automáticamente: 1) llame al dtor sobre el objeto (s) 2) libere la memoria. La primera línea de código se ocupa de # 1. Ahora, la segunda línea, se ocupa de liberar esa parte del 'pool' de donde provienen los objetos de la matriz. – dirkgently

Cuestiones relacionadas