Si estoy usando un objeto CString como este:

void myFunc(char *str)
{
  CString s(str);
  //Manipulate other data with CString
  //...
  //Finished

  //Should I somehow delete 's' here to avoid a memory leak?
}

Es la cadena de texto borrados una vez que la función se va fuera de su alcance?

También, yo sé que el new palabra clave asigna memoria, si me la construcción de un objeto sin la new palabra clave, es la memoria asignada? Mi intuición me dice que sí, pero me gustaría comprobar.

por ejemplo,

CString *asdf = new CString("ASDF");
//same as?
CString asdf("ASDF"); 
InformationsquelleAutor Chris Dargis | 2012-06-07

4 Comentarios

  1. 14

    new asigna memoria en el montón, así

    CString *asdf = new CString("ASDF");

    Asigna un CString en el montón y se asigna un puntero a asdf. Que la memoria no se libera, ni el destructor de asdf ser llamado hasta que llame delete asdf.

    Sin new, se están destinando en el pila, así

    CString asdf("ASDF");

    asigna memoria de pila, que asdf representa. Esta memoria se recupera automáticamente cuando la pila está corregida (como en el momento de retorno de una función) y el destructor de asdf es llamado automáticamente cuando se sale del ámbito.

    También, CString limpia sus propios recursos, por lo que si el CString objeto es limpiado (sale del ámbito si está en la pila o se elimina si es en el montón), los recursos que utiliza también será limpiado.

    • Que hace que una gran cantidad de sentido. Gracias por la aclaración. Esta era exactamente la respuesta que estaba buscando.
  2. 1

    CString gestiona la memoria para la cadena de caracteres en sí, por lo que éste se encarga de liberar la memoria en su destructor (es un poco más inteligente, pero creo que de esa manera).

    Si se le asigna a un CString con new y nunca llame delete en ella no sólo se fuga de la memoria para la CString objeto, sino también su destructor nunca es llamado para que pérdida de la memoria para la cadena de caracteres.

  3. 1

    Cuando se crea un objeto CString en la mayoría de los casos, usted va a terminar con dos tramos, uno para el objeto en sí mismo y uno de los caracteres de la cadena. El carácter de asignación está oculto dentro del objeto y usted no tiene que preocuparse acerca de esto. Si se declara el objeto como una variable automática como en el primer ejemplo, el objeto se cancela la asignación al final de la cuadra es decir, la llave de cierre. Si usted asignar con new más adelante debe delete o habrá una pérdida de memoria.

  4. 0

    Si se le asigna a un objeto en la pila (es decir, si usted no los usa de nuevo) entonces será destruido automáticamente cuando se sale del ámbito en el final de la función.

Dejar respuesta

Please enter your comment!
Please enter your name here