Pregunta

Entonces tengo un puntero a una serie de punteros.Si lo borro así:

delete [] PointerToPointers;

¿Eso también eliminará todos los punteros señalados?Si no, ¿tengo que recorrer todos los punteros y eliminarlos también, o hay una manera más fácil de hacerlo?Mi google-fu no parece darme buenas respuestas a esta pregunta.

(Y sí, sé que necesito usar un vector.Esta es una de esas tareas del tipo "ponerse al día con C++" en la escuela).

¿Fue útil?

Solución

Sí, tienes que recorrer los punteros y eliminarlos individualmente.

Razón:¿Qué pasaría si otro código tuviera punteros a los objetos de su matriz?El compilador de C++ no sabe si eso es cierto o no, por lo que debes ser explícito.

Para una "manera más fácil", dos sugerencias:(1) Cree una subrutina para este propósito, de modo que al menos no tenga que escribir el código más de una vez.(2) Utilice el paradigma de diseño de "puntero inteligente" en el que contiene una matriz de objetos con contadores de referencia, luego los objetos se eliminan cuando ningún código ya hace referencia a ellos.

Otros consejos

Estoy de acuerdo con Jason Cohen, aunque podemos ser un poco más claros sobre el motivo por el que necesitamos eliminar los punteros con el bucle.Para cada asignación de memoria "nueva" o dinámica, es necesario "eliminar" una desasignación de memoria.Algunas veces el "eliminar" se puede ocultar, como ocurre con los punteros inteligentes, pero sigue ahí.

int main()
{
  int *pI = new int;
  int *pArr = new int[10];

Hasta ahora en el código hemos asignado dos fragmentos de memoria dinámica.El primero es solo un int general y el segundo es una serie de int.

  delete pI;
  delete [] pArr;

estas declaraciones de eliminación borran la memoria asignada por los "nuevos"

  int ppArr = new int *[10];

  for( int indx = 0; indx < 10; ++indx )
  {
    ppArr[indx] = new int;
  }

Este fragmento de código realiza las dos asignaciones anteriores.Primero, estamos creando espacio para nuestro int en una matriz dinámica.Luego necesitamos recorrer y asignar un int para cada lugar en la matriz.

  for( int indx = 0; indx < 10; ++indx )
  {
    delete ppArr[indx];
  }
  delete [] ppArr;

Tenga en cuenta el orden en que asigné esta memoria y luego la desasigné en orden inverso.Esto se debe a que si tuviéramos que eliminar [] ppArr;Primero perderíamos la matriz que nos dice cuáles son nuestros otros punteros.Ese fragmento o memoria se devolvería al sistema y, por lo tanto, ya no se podrá leer de manera confiable.

  int a=0;
  int b=1;
  int c=2;

  ppArr = new int *[3];

  ppArr[0] = &a;
  ppArr[1] = &b;
  ppArr[2] = &c;

Creo que esto también debería mencionarse.El hecho de que esté trabajando con punteros no significa que la memoria a la que apuntan esos punteros se haya asignado dinámicamente.Es decir, el hecho de que tenga un puntero no significa que necesariamente deba eliminarse.La matriz que creé aquí se asigna dinámicamente, pero los punteros apuntan a instancias locales de ints. Cuando eliminamos esto, solo necesitamos eliminar la matriz.

  delete [] ppArr;

  return 0;

}

Al final, la memoria asignada dinámicamente puede ser complicada y, de todos modos, puede envolverla de forma segura como en un puntero inteligente o usar contenedores stl en lugar de los suyos puede hacer su vida mucho más placentera.

Ver contenedor de puntero de impulso para un contenedor que realiza la eliminación automática de los punteros contenidos por usted, manteniendo al mismo tiempo una sintaxis muy cercana a los contenedores STL comunes.

Los punteros son prácticamente solo referencias de memoria y no pequeños y elegantes objetos .net autolimpiables.Crear destructores adecuados para cada clase hará que la eliminación sea un poco más limpia que los bucles masivos en todo el código.

Tomemos un ejemplo del mundo real (pseudocodificado). Imagina que tienes una clase como esta:

class Street
{
    public:
        Street();
        ~Street();
    private:
        int HouseNumbers_[];
}

typedef *Street StreetSign;

Si tiene una serie de letreros de calles y elimina su conjunto de letreros de calles, eso no significa que elimine las calles automáticamente.Todavía están allí, ladrillos y cemento, pero ya no tienen esos carteles que los señalen.te has deshecho de aquellos específicos casos de indicadores de las calles.

Una matriz de punteros es (conceptualmente) un poco como una matriz de números enteros: es una matriz de números que representa las ubicaciones de memoria de varios objetos.No son los objetos en sí.

Si elimina [] la matriz de punteros, todo lo que ha hecho es eliminar una matriz de números enteros.

Creo que tendrás que dar un rodeo, me temo.

No sé por qué la respuesta fue tan confusa y larga.

Si elimina la matriz de punteros, liberará la memoria utilizada para una variedad de usualmente INTS.
un puntero a un objeto es un número entero que contiene la dirección.

Eliminaste un montón de direcciones, pero ningún objeto.

ALETE no le importa el contenido de un espacio de memoria, llama a un destructor (s) y marca el MEM como gratuito.

No le importa que simplemente elimine un montón de direcciones de objetos, simplemente ve ints.

¡Es por eso que primero debes recorrer la matriz!Y llame a Eliminar en cada elemento, luego puede eliminar el almacenamiento de la matriz en sí.

Bien ahora mi la respuesta se hizo algo larga.......extraño...;)

Editar:La respuesta de Jason no es incorrecta, simplemente no da en el blanco.Ni el compilador ni nada más en C (++) se preocupan por que elimine las cosas a las que está en otro lugar.Puedes simplemente hacerlo.Otras piezas del programa que intentan usar los objetos eliminados se verán de usted.Pero nadie te lo impedirá.Tampoco será un problema destruir una matriz de punteros a los objetos, cuando los objetos se hacen referencia en otro lugar.

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