2011-03-14 22 views
7

En mi programa, tengo línea como la siguiente:Destructor en const char *

const char * str = getStr(); 

¿Tengo que llamar a destructor de str [] al final de la función para evitar pérdidas de memoria?

+3

Depende si getStr asigna memoria o no. – Joe

+7

Dado que esto está etiquetado como 'C++', deberías considerar usar 'std :: string'. – James

+0

Además de todo lo que se dijo, no se puede llamar a * destructor * en un c-string 'const char *'. Solo podías, como decía, 'eliminar' o 'libre()'. :)/nit-picking – Xeo

Respuesta

23

pregunta no contiene información suficiente para determinar, depende de lo getStr() hace. Por ejemplo:

const char *getStr() { 
    return "boo"; 
} 

entonces usted debe no llamada eliminar.

const char *getStr() { 
    return new char; 
} 

entonces usted debe llamar delete str; para evitar una pérdida de memoria (y no debe llamar delete[]).

const char *getStr() { 
    return new char[10]; 
} 

entonces usted debe llamar delete[] str; para evitar una pérdida de memoria (y no debe llamar delete).

const char *getStr() { 
    return 0; 
} 

entonces no importa lo que haces, llamando a cualquier tipo de delete en str no tiene ningún efecto.

La propiedad de los recursos, y cómo liberar los recursos que posee, son parte de la interfaz de una función, y deben documentarse al mismo tiempo que documente cuál es realmente el valor devuelto.

+0

Olvidaste agregar la opción de usar strdup u otra API C para agregar el toque extra. –

+0

@Martin: cierto. Tampoco cubrí la posibilidad de que 'getStr()' devuelva un puntero a datos asociados con alguna entidad compartida contada por referencia personalizada, y que se llame a una función 'freeStr()' coincidente para disminuir ese recuento de referencia. –

+0

Verdadero; pero la situación '' más común '' para devolver un puntero C-String proviene de una biblioteca C que usará las rutinas de manipulación de cadenas C. Y en IMO es un escenario mucho más probable que cualquiera de los postulados anteriores (aparte del literal de la cadena). –

0

Es una buena idea hacerlo si se está quedando fuera del alcance. Me gustaría recomendar también establecer el puntero a null para asegurarse de que no está colgando:

delete[] str; 
str = null; 
+0

¿quisiste decir eliminar [] str; ? – Timo

+0

Lo noté y lo solucioné hace un momento :) – BrMcMullin

+1

establecer punteros a NULL es un signo de otros problemas en su código y con RAII se vuelve innecesario. Como resultado, desaconsejaría el código C++, ya que oculta errores durante el desarrollo. Por supuesto, si esta era una pregunta en C, su punto sería válido (pero aún oculta los problemas). –

2

Todo depende de lo que haga getStr(). Incluso puede ser que deba llamar al free en el puntero si getStr() lo creó con malloc. Puede ser que getStr() esté devolviendo un puntero a un área estática (no muy segura para subprocesos, pero sucede) o cualquier cantidad de otras cosas.

Parte del contrato y la documentación para getStr() debe ser quién posee el puntero que devuelve.

Éstos son algunos ejemplos de las posibles funciones getStr() ...

En este caso getStr() posee el puntero y usted no tiene que hacer nada para liberarlo.Otoh, lo que se está apuntando a puede cambiar la próxima vez que llame getStr() por lo que probablemente debe hacer su propia copia si es necesario para mantenerlo alrededor durante cualquier período de tiempo:

const char *getStr() 
{ 
    static char buf[30] = "Silly counter"; 

    buf[0] = buf[0] + 1; 
    return buf; 
} 

En este caso, es muy probable que necesite llamar free en el puntero devuelto:

const char *getStr() 
{ 
    return strdup("Silly string"); 
} 

en este caso, tendrá que llamar a secas delete en el puntero devuelto:

const char *getStr() 
{ 
    return new char; 
} 

En este caso, tendrá que llamar delete [] en el puntero devuelto:

const char *getStr() 
{ 
    return new char[50]; 
} 

hay muchas otras posibilidades. Como indiqué anteriormente, parte del contrato para una función (que debe aparecer en su documentación) es quién posee el puntero devuelto y cómo los datos apuntados deben eliminarse si hacerlo es responsabilidad del interlocutor.

+0

+1 por mencionar la posibilidad de 'free' en su lugar – user470379

1

Depende de cómo se haya diseñado getStr(). Podría devolver un puntero a una cadena que todavía es propiedad de otra persona (y en este caso la respuesta es no) o puede devolver un puntero y la persona que llama se convierte en el propietario (y en este caso la respuesta es sí).

Debe consultar la documentación de getStr para saber.

Si la propiedad de la zona devuelta es de la persona que llama probablemente en C++ devolver un std::string habría sido una idea mucho mejor.

Cuestiones relacionadas