[C con Clase] Memoria,memoria!!

Steven Davidson steven en conclase.net
Mie Jun 20 04:07:11 CEST 2007


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


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