[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