[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