C/Visual C - sobre delete

 
Vista:

sobre delete

Publicado por Oliver++ (339 intervenciones) el 06/09/2002 21:51:58
si tengo un vector de enteros almacenados dinámicamente en memoria con new y luego decido liberar este espacio con delete, Como delete sabe la cantidad de elementos que existen en el vector?
int* p = new int[30];
delete [] p; //como delete sabe que son 30 elementos que quiero borrar?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:sobre delete

Publicado por Alvaro (122 intervenciones) el 07/09/2002 00:26:19
Pregunta dificil...
Si alguien te la responde, ese tipo es un ERUDITO.
Me imagino (solo eso), que un proceso en memoria tiene una especie de bitmap con la parte de su heap que está siendo utilizada y, por cada segmento del heap ocupado, un espacio de memoria para guardar el largo que este utiliza en la heap.

Considera una funcion void *tu_malloc(size_t size) que asignara 'size' bytes en la memoria mas N al comienzo para guardar el valor de 'size'. al retornar, esta funcion pararia la direccion siguiente a los N primeros que asigno.

Tu funcion void tu_free(void *) debería tomar este valor (simplemente decrementando el puntero).

Si alguien te responde con la verdad estaré pendiente.
Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sobre delete

Publicado por Googol (255 intervenciones) el 07/09/2002 12:16:04
¿Y si haces int *a = new int cómo sabe que ocupa 4 bytes? Pues igual :-)
En realidad la memoria libre que controla el new y el delete (o el malloc y el free) está organizada como una "lista dinámica de bloques libres y ocupados", de modo que, aunque a tí te de el puntero al bloque libre, justo antes (unos cuantos bytes por delante) existe información sobre ese bloque, conteniendo información como el tamaño, y punteros al bloque siguiente y anterior. De ese modo, siguiendo los bloques con esos punteros, el new y el delete pueden buscar los bloques libres, o liberar los antiguos.
No se puede decir exactamente qué información hay delante, porque cada implementación lo hace como le da la gana. De todas formas una vez oí que justo cuatro bytes detrás del puntero que te devolvió el new (4 bytes en Windows, supongo que 2 en MS-DOS) está el espacio ocupado por el bloque. Pero nunca lo comprobé...

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar