C++ al eliminar un puntero a un puntero

Así que tengo un puntero a un array de punteros. Si voy a borrar como este:

delete [] PointerToPointers;

Tendrá que eliminar todos los señaló punteros así? Si no, ¿tengo que recorrer todos los punteros y eliminar así, o hay una manera más fácil de hacerlo? Mi google-fu no se parece a darme las buenas respuestas a esta pregunta.

(Y sí, sé que tengo que usar un vector. Este es uno de esos «catch up en C++» tipo de tareas en la escuela).

InformationsquelleAutor Jason Baker | 2008-09-07

7 Kommentare

  1. 29

    Sí tiene un bucle a través de los punteros, eliminando de forma individual.

    Razón: ¿y si otro código tenido punteros a los objetos de la matriz? El compilador de C++ no sabe si eso es cierto o no, lo que tiene que ser explícito.

    Por un «camino más fácil», dos sugerencias: (1) Hacer una subrutina para este propósito, de modo que al menos usted no tendrá que escribir el código más de una vez. (2) Utilizar el «puntero inteligente» paradigma de diseño donde usted tiene una matriz de objetos con la referencia de los contadores, a continuación, se eliminan los objetos cuando los objetos ya no se hace referencia por ningún código.

  2. 18

    Estoy de acuerdo con Jason Cohen pesar de que puede ser un poco más clara sobre la razón por la que necesita para eliminar su punteros con el bucle. Por cada «nuevo» o asignación de memoria dinámica que existe la necesidad de «eliminar» a la memoria de la asignación. Algunas veces el «eliminar» puede estar oculto, como con smartpointers pero sigue ahí.

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

    hasta ahora en el código que hemos asignado dos trozos de la memoria dinámica. La primera es sólo un general int el segundo es un array de enteros.

      delete pI;
      delete [] pArr;

    estos delete borrar la memoria de la que fue asignada por el «nuevo»s

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

    Este trozo de código que se está haciendo tanto de las asignaciones previas. En primer lugar estamos creando un espacio para nuestros int en una matriz dinámica. Entonces necesitamos para recorrer y asignar un int para cada punto de la matriz.

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

    Nota el orden en el que me asignaron esta memoria y, a continuación, que yo de-asignados en el orden inverso. Esto es porque si fuéramos a hacer el delete [] ppArr; lo primero que hicimos fue perder la matriz de la que nos dice lo que nuestros otros punteros. Que pedazo de memoria o se habría dado la vuelta al sistema y por lo tanto puede no ser confiable leer.

      int a=0;
      int b=1;
      int c=2;
    
      ppArr = new int *[3];
    
      ppArr[0] = &a;
      ppArr[1] = &b;
      ppArr[2] = &c;

    Esto, creo que debe ser mencionado. Sólo porque usted está trabajando con punteros no significa que la memoria de los punteros apuntan a que fue asignada dinámicamente. Es decir, sólo porque usted tiene un puntero no significa que necesariamente debe ser eliminar. La matriz que he creado aquí se asigna de forma dinámica, pero los punteros apuntan a instancias locales de enteros Cuando eliminamos esto sólo tenemos que eliminar de la matriz.

      delete [] ppArr;
    
      return 0;
    
    }

    Al final memoria asignada dinámicamente puede ser complicado, y de todos modos se puede resumir de forma segura como en un puntero inteligente o mediante el uso de contenedores stl en lugar de su propio puede hacer su vida mucho más agradable.

  3. 3

    Punteros son más o menos igual que las referencias de memoria y no spiffy poco de auto-limpieza .neto de los objetos. La creación adecuada de los destructores de cada clase hará que la eliminación de un poco más limpia que la masiva bucles a lo largo del código.

  4. 3

    Echemos un (pseudocoded) ejemplo del mundo real .Imagine que usted tenía una clase como esta:

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

    Si usted tiene una matriz de señales en la calle, y se elimina la matriz de streetsigns, eso no significa que automáticamente elimine el sreets. Que sigues allí, los ladrillos y el mortero, solo que no tienen los signos que apuntan a más. Se han librado de aquellos específicos de instancias de punteros a las calles.

    Un array de punteros (conceptualmente) un poco como una matriz de números enteros, es una matriz de números que representan las ubicaciones de memoria de varios objetos. No los objetos en sí.

    Si delete[] la matriz de indicadores, todo lo que han hecho es eliminar una matriz de enteros.

  5. 0

    No sé por qué esto fue contestado tan confusamente largo.

    Si se elimina la matriz de indicadores, se libre
    la memoria usada por una matriz de enteros.

    un puntero a un objeto es un entero que contiene la dirección.

    Elimina un montón de direcciones, pero no los objetos.

    eliminar no se preocupan por el contenido de un espacio de memoria,
    llama a un destructor(s) y marca el mem como libre.

    Que no le importa que se acaba de eliminar un montón de direcciones
    de los objetos, simplemente se ve ints.

    Es por eso que usted tiene que recorrer la matriz primero! y llame a eliminar
    en cada elemento, a continuación, puede eliminar el almacenamiento de la propia matriz.

    Bien, ahora mi respuesta tengo un poco largo… …. extraño… 😉

    Editar:
    Jason respuesta no está mal, simplemente no dio en el clavo. Ni
    el compilador ni de ninguna otra cosa en c(++) se preocupa por ti eliminando cosas que en otros lugares es
    señalaron. Usted puede simplemente hacerlo. Otras partes del programa tratando de usar los objetos eliminados
    le violación de segmento en usted. Pero nadie va a estorbar.
    Tampoco será un problema para destruir una matriz de punteros a los objetos, cuando los objetos
    se hace referencia en otros lugares.

    • «Otras partes del programa tratando de usar el borrado de objetos a la violación de segmento en que»…. segfaulting es, probablemente, el mejor resultado posible, se intercepta el lugar donde está el problema. Pero hay un montón de otras posibilidades, que no se dio cuenta hasta más tarde y podría incluso causar daños duraderos pasado la salida del programa (si un archivo de búfer de escritura consiguió asignados en el ahora de la memoria libre, por ejemplo).

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea