Pregunta

¿Es cierto que un puntero asignado a la dirección inicial de una matriz asignada dinámicamente no tiene la información del tamaño de la matriz? Así que tenemos que utilizar otra variable para almacenar su tamaño para su posterior procesamiento de la matriz a través del puntero.

Pero cuando nos liberamos la matriz asignada dinámicamente, no se especifica el tamaño, en lugar de simplemente "ptr libre" o "delete [] ptr". ¿Cómo podría liberar o eliminar conocer el tamaño de la matriz? Se puede utilizar el mismo esquema para evitar almacenar el tamaño de la matriz en otra variable?

Gracias!

¿Fue útil?

Solución

Sí, esto es cierto.

delete sabe el tamaño de la porción de memoria porque new añade información adicional a la porción (por lo general antes de la zona devuelve al usuario), que contiene su tamaño, junto con otra información. Tenga en cuenta que todo esto es mucho implementación específica y no debe ser utilizado por el código.

Así que para responder a su última pregunta: No - no podemos usarlo - es un detalle de implementación que es altamente dependiente de la plataforma y el compilador.


Por ejemplo, en el asignador de memoria de muestras demostrado en K & R2, este es el "header" colocado antes de cada trozo asignado:

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;

  Align x; /* force alignment of blocks */
};

typedef union header Header;

size es el tamaño del bloque asignado (que es luego utilizado por free, o delete).

Otros consejos

Lo curioso es que, históricamente, se delete [20] arr; tal como es arr = new int[20]. Sin embargo la práctica demostró que la información sobre el tamaño se puede almacenar sin dolor por el asignador, y desde la mayoría de personas que lo usan después se almacenan todos modos, se añadió a la norma.

Lo que es más divertido, y poco conocido, es el hecho de que este "sintaxis de eliminación extendida" es, de hecho, con el apoyo de unos compiladores de C ++ (a pesar de ser errónea, incluso en la cara de la 98 C ++ estándar), aunque ninguno de ellos requiere a él.

int* arr = new int[20];
delete [20] arr;

La parte triste de todo esto es, sin embargo, que no hay manera de que sigan los estándares para recuperar ese tamaño aprobada para su uso: - /

Es cierto que la matriz no contiene el tamaño de la matriz, lo que tiene que almacenar esa información para más tarde. Al borrar una matriz a través delete o free es el puntero a la memoria asignada a pasar. El administrador de memoria utilizada (ya sea por el sistema o en su propio personalizado desde anulando nuevo y borrar) conoce la zona de memoria que se libera, y realiza un seguimiento de la misma. Espero que tenga sentido.

Sí, es cierto. Esto es parte de por qué usted debe rara vez tratar de hacer frente a esto directamente, y utilizar un contenedor estándar en su lugar. Acerca de la única vez que tiene sentido para tratar con él es que si decide implementar un recipiente a sí mismo (en cuyo caso normalmente va a realizar un seguimiento de la información en la ejecución de su contenedor).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top