sirven que punteros puntero para operaciones los declaracion con cadenas aritmetica c++ pointers

que - punteros c++



C++ eliminando un puntero a un puntero (7)

Así que tengo un puntero a una matriz de punteros. Si lo elimino así:

delete [] PointerToPointers;

¿Eliminará eso todos los punteros apuntados también? De lo contrario, ¿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 ninguna buena respuesta a esta pregunta.

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


Creo que tendrás que pasar por encima, me temo.


Los punteros son más o menos referencias de memoria y no pequeños objetos .net autolimpiantes. 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.


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

Motivo: ¿Qué pasa si otro código tiene punteros a los objetos en su matriz? El compilador de C ++ no sabe si es cierto o no, por lo que debe ser explícito.

Para una "forma más fácil", dos sugerencias: (1) Haga una subrutina para este fin, 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" donde mantenga una matriz de objetos con contadores de referencia, luego los objetos se eliminarán cuando los objetos ya no estén referenciados por ningún código.


Consulte BoosterPointerContenedor para un contenedor que hace la eliminación automática de punteros contenidos para usted, mientras mantiene una sintaxis muy cercana a contenedores STL ordinarios.


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

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

Borraste un grupo de direcciones, pero no objetos.

delete no se preocupa por el contenido de un espacio de memoria, llama a un destructor (es) y marca la memoria como libre.

No importa que simplemente borre un grupo de direcciones de objetos, simplemente vea enteros.

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

Bueno, ahora mi respuesta fue algo larga ... ... extraña ...;)

Editar: la respuesta de Jason no está mal, simplemente falla al golpear el punto. Ni el compilador ni ninguna otra cosa en c (++) se preocupa de que elimines cosas a las que se apunta en otro lugar. Puedes hacerlo. Otras partes del programa que intenten usar los objetos eliminados te segmentarán. Pero nadie te obstaculizará. Tampoco será un problema destruir una serie de punteros a objetos, cuando los objetos se mencionan en otra parte.


Tomemos un ejemplo del mundo real (pseudocódigo). Imagine que tiene 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 matriz de señales de calles, eso no significa que borre automáticamente las calles. Todavía están allí, ladrillos y cemento, simplemente ya no tienen esos signos que los señalen. Has eliminado esas instancias específicas de indicadores en las calles.

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

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


Estoy de acuerdo con Jason Cohen, aunque podemos aclarar un poco el motivo por el que necesitamos eliminar los punteros con el ciclo. Para cada asignación de memoria "nueva" o dinámica, debe haber una "eliminación" de una asignación de memoria. Algunas veces la "eliminación" puede ocultarse, como con los smartpointers, pero aún está allí.

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

hasta el momento en el código hemos asignado dos trozos de memoria dinámica. El primero es solo un int general, el segundo es un conjunto de ints.

delete pI; delete [] pArr;

estas instrucciones de borrado borran la memoria asignada por los "nuevos"

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

Este bit de código está haciendo las dos asignaciones anteriores. Primero, estamos creando espacio para nuestro int en una matriz dinámica. Luego, debemos recorrer y asignar un int para cada punto de 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 que la desasigné en el orden inverso. Esto es porque si tuviéramos que hacer el delete [] ppArr; primero perderíamos la matriz que nos dice cuáles son nuestros otros indicadores. Ese trozo o memoria se devolvería al sistema y, por lo tanto, ya no se puede leer con fiabilidad.

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 debería mencionarse también. El hecho de que esté trabajando con punteros no significa que la memoria a la que apuntan esos punteros haya sido asignada dinámicamente. Es decir, solo porque tenga un puntero no significa que necesariamente deba eliminarse. La matriz que creé aquí está asignada 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 utilizando contenedores stl en lugar de los suyos, lo que puede hacer que su vida sea mucho más placentera.