¿Cómo se declara y utiliza un operador de la piscina sobrecargado borrar?
-
22-09-2019 - |
Pregunta
Me gustaría saber adaptarse de 11.14 el C ++ -. FAQ-lite para arrays
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 ayudarme aquí?
Solución 2
Es imposible. Bjarne razones que nunca lo haré bien averiguar la piscina correcta. Su solución es:. Debe llamar manualmente todos los destructores y luego averiguar la piscina correcta para poder anular la planificación de la memoria manualmente
Referencias:
Bjarne FAQ: ¿Hay eliminar una ubicación
Relevant C ++ secciones estándar:
3.7.3.2.2 único operador miembro de funciones de borrado con un argumento de tipo size_t se consideran las expresiones de borrado.
5.3.5.1 sintaxis de las expresiones Eliminar no permite parámetros adicionales.
Otros consejos
Llama a los dtors sobre los objetos individuales primero y luego usar:
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 se encuentra allí.