2010-08-07 26 views
6

Vi un ejemplo del uso de la función: eliminar en cpp y no lo entendí por completo. el código es:eliminar la función en C++

class Name { 
    const char* s; 
    //... 
}; 

class Table { 
     Name* p; 
     size_t sz; 
public: 
     Table(size_t s = 15){p = new Name[sz = s]; } 
     ~Table { delete[] p; } 
}; 

Cuál es la acción exacta del comando: delete[] p;?

Creo que el objetivo era eliminar todos los punteros en el contenedor Tabla.

Los corchetes en delete[] me dan una pista de que elimina una matriz de punteros a Nombre pero no se especifica el tamaño de la matriz, entonces, ¿cómo sabe el destructor cuántos punteros eliminar?

+0

posible duplicación de [eliminar vs eliminar \ [\] operadores en C++] (http://stackoverflow.com/questions/2425728/delete-vs-delete-operators-in-c) y [¿Cómo funciona la eliminación en C++ sabe cuántas ubicaciones de memoria eliminar] (http://stackoverflow.com/questions/2327848/how-does-the-delete-in-c-know-how-many-memory-locations-to-delete) –

+1

" todos los punteros "- tenga en cuenta que' Table' solo contiene un solo puntero. Es un puntero a una matriz asignada dinámicamente de 'Nombre', pero solo hay un objeto creado dinámicamente (la matriz) que necesita ser desasignado. –

Respuesta

13

delete no es una función, es un operador.

Una expresión delete que usa [] destruye los objetos creados con new ... [] y libera la memoria asociada. delete[] se debe utilizar para los punteros devueltos por new ... []; no de matriz delete solo en punteros devueltos porque no sean matrices. El uso del formulario delete que no concuerda siempre es incorrecto.

La expresión delete en ~Table() (falta () en su código) va a destruir la matriz creada dinámicamente objetos de Name asegurando que el destructor Name se llama para cada miembro de la matriz.

Es la implementación para implementar algún mecanismo de registro de la cantidad de elementos en las matrices asignadas con new ... [], el programador no tiene que preocuparse por esto.

En muchas implementaciones, donde los elementos de la matriz tienen destructores no triviales, una expresión new[] asignará espacio adicional para registrar el recuento de elementos antes del espacio para todos los miembros de la matriz. Este recuento oculto se busca cuando se usa delete[] para garantizar que se llama al número correcto de destructores. Sin embargo, esto es solo un detalle de implementación, otras implementaciones son posibles.

+0

1) en el código, muchos objetos se pueden inicializar con un nuevo ... [] ¿cuál de ellos se destruye mediante la eliminación? 2) también en el código de ejemplo() faltaban. –

+2

@Day_Dreamer: Otra forma de pensarlo es como una única matriz de muchos objetos. 'new Name [sz]' asigna una matriz (de muchos objetos) 'delete []' desasigna la matriz única (de muchos objetos). Cada miembro de la matriz se destruye cuando la matriz se destruye. –

1

En resumen, delete[] conoce el tamaño de la matriz que está borrando porque es necesario.

Porque el estándar de lenguaje C++ establece que debe saber. Así que cuando asigna una matriz, depende del sistema almacenar el tamaño en algún lugar donde delete[] pueda encontrarla.

Una opción es asignar unos bytes más de lo necesario. Utilice los primeros bytes para especificar el tamaño y, en lugar de devolver un puntero al primer byte asignado, devuelva un puntero al primer byte más allá del campo de tamaño.

Luego, delete[] solo tiene que restar algunos bytes del puntero para encontrar el tamaño.

Otra opción podría ser tener un map<void*, int> global, donde la clave es el puntero a una asignación de memoria, y el valor es el tamaño de esa asignación. Hay muchas otras maneras en que delete[] puede averiguar el tamaño. El estándar de C++ no especifica cuál usar. Simplemente dice que delete[] debe conocer el tamaño, y deja que los implementadores se den cuenta cómo para sacarlo.

+0

¿Dónde está la implementación del mecanismo del par: eliminar y nuevo? –

+0

en la biblioteca de tiempo de ejecución, que generalmente se proporciona con el compilador. – jalf