[C con Clase] Memoria,memoria!!

Pogui poguijuaz en gmail.com
Mie Jun 20 20:11:55 CEST 2007


Steven Davidson escribió:
> Hola Zaka,
>
> El pasado 2007-06-20 01:42:41, Shanatos escribió:
>
> S> Hola a todos!
> S> ¿Es correcto hacer lo siguiente?
> S> char *frase = "Frase cualquiera";
> S> ....(uso de la frase en cualquier contexto)
>
> La verdad es que debería ser:
>
> const char *frase = "Frase cualquiera";
>
> Sin embargo, por motivos de compatibilidad con programas escritos en C, se permite indicar el tipo 'char *' para inicializar con cadenas constantes o literales.
>
> S> delete frase;
> S> Lo comento por que el tipo char *frase apunta ( teóricamente ) a un 
> S> carácter, por lo que a la hora de liberar debería liberar un carácter 
> S> también, pero lo que queremos nosotros es liberar toda la frase.
>
> Hasta cierto punto tienes razón. Se usaría el operador 'delete[]' para liberar memoria que apunta a un array dinámico. Por ejemplo,
>
> string *pStr = new string( "Hola a todos" );
> int *pLista = new int[1000];
> ...
> delete[] pLista;  // Array
> delete pStr;      // Un solo objeto
>
> La regla de "emparejamiento" aún funciona en estos casos. Si usamos 'new[]' usaremos 'delete[]'; si usamos 'new' entonces usamos 'delete'.
>
>
> Ahora bien, en el caso que presentas, lo que sucede es que el compilador se encarga de la cadena literal "Frase cualquiera"; es decir, la crea, la mantiene, y luego la destruye cuando vea conveniente. Esto implica que tal cadena no es nuestra responsabilidad y por tanto no debemos destruirla explícitamente.
>
>
> Espero haber aclarado la duda.
>
> Steven
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
>   
tenes que liberar la memoria con un bucle, si liberas el puntero lo 
unico que liberas es la memoria perteneciente al puntero, si lo que 
queres es liberar toda la cadena, tenes que liberar bloque por bloque 
hasta que termine la respectiva cadena.
Espero ayudarte, salu2
Pogui




Más información sobre la lista de distribución Cconclase