[C con Clase] Tengo una duda con punteros
Steven R. Davidson
vze266ft en verizon.net
Mie Ene 23 01:09:10 CET 2008
Hola Pierre,
Pierre van der Laat Ulate wrote:
> Hola de nuevo, tengo una duda con los punteros, cuando se quiere
> inicializar un puntero a una cadena de caracteres, ¿es necesario
> hacer esto o no?:
>
> char *cadena;
> cadena=new char;
> cadena="hola";
Aunque esto es posible, no es lógico. Primeramente, creas memoria para
un solo 'char'. Como 'char' ocupa siempre 1 byte, 'cadena' apunta a 1
byte en memoria. Seguidamente, reasignas el valor de 'cadena' para que
ahora apunte a la cadena literal "hola".
Esto significa que la memoria que creaste ya no puede ser liberada por
tu programa, porque has perdido el único "enlace" a ella. También
significa que no puedes liberar la memoria de 'cadena', porque la cadena
literal fue creada por el compilador, el cual no fue creada
dinámicamente sino estáticamente.
En cuanto a la lógica de lo pretendido, lo que quieres hacer es crear un
bloque de memoria contigua de varios elementos de tipo 'char'. Para
esto, debes usar el operador 'new[]'. Esto sería,
cadena = new char[5];
Para copiar una cadena a otra, debemos que hacer tal copia de elementos
de uno en uno. Como esto es algo engorroso, podemos invocar la función
estándar 'strcpy()'. Por ejemplo,
strcpy( cadena, "hola" );
A la hora de liberar la memoria, usaríamos el operador 'delete[]'; esto es,
delete[] cadena;
> ...
> delete cadena;
>
Como he mencionado anteriormente, esta sentencia seguramente fallará,
porque 'cadena' apunta a una cadena literal creada estáticamente.
> Lo anterior no me funcionó, pero sigo con la duda de si hay que
> liberar la memoria o no?
>
Siempre que tú mismo crees memoria dinámicamente, debes liberarla. Visto
de otro modo, por cada 'new' debe haber un 'delete' y por cada 'new[]'
debe haber un 'delete[]'.
Espero que esto aclare tu duda.
Steven
Más información sobre la lista de distribución Cconclase