Pregunta

Estaba viendo un ejemplo aquí:https://blog.parasoft.com/finding-memory-leaks-in-c

#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char *string, *string_so_far;
    int i, length;     length = 0;
    for(i=0; i<argc; i++) {
        length += strlen(argv[i])+1;
        string = malloc(length+1);

        /*  * Copy the string built so far. */
        if(string_so_far != (char *)0)
            strcpy(string, string_so_far);
        else *string = '\0';
        strcat(string, argv[i]);
        if(i < argc-1) strcat(string, " ");
        string_so_far = string;
    }
    printf("You entered: %s\n", string_so_far);
    return (0);
}

y leemos eso cuando ejecutamos el programa con los siguientes argumentos:

hello this is a test

La variable string_so_far apunta a la cadena "hola" que se asignó como resultado de la iteración del bucle anterior.¿Pero no entiendo cómo?Una explicación paso a paso sería realmente útil.

En segundo lugar, encontré este ejemplo en el material del curso:

int countPrimes(int n)
{
   PrimeSet *p = new PrimeSet(n);
      return( p->countPrimeNumbers() );
}

Se dijo que hay una pérdida de memoria aquí, pero realmente no entiendo cómo, probablemente porque no estoy seguro de qué está sucediendo exactamente aquí.

¿Fue útil?

Solución

En el primer ejemplo, usas malloc dentro de un bucle para una variable.El malloc La llamada reserva un bloque de memoria y devuelve la primera dirección del bloque.Necesitas eliminar para bloquear con free si ya no lo necesitas.Si el programador desea ampliar el bloque de memoria, la mejor alternativa sería realloc.Leer más sobre realloc en http://www.cplusplus.com/reference/cstdlib/realloc/.

En su segundo ejemplo, el objeto en el que el puntero p apunta se inicializa en el montón y permanecerá en el montón hasta que el programador utilice delete.Una alternativa más segura para crear objetos en el montón es crearlos en la pila, lo que eliminará todos los datos una vez finalizada la llamada de un método.

int countPrimes(int n){
   PrimeSet p(n);
   return( p.countPrimeNumbers() );
}

Si la gestión de la memoria no se realiza correctamente como en el segundo ejemplo, el objeto no se puede eliminar después de que se pierde la única referencia al mismo, por lo que se produce una pérdida de memoria.

Otros consejos

En su segundo ejemplo, asignará espacio para un objeto de Primeset y inicializa, luego llame a la función CountPrimenumbers.El objeto de Primeset aún existe, todavía ocupa la memoria, probablemente asignó más memoria, y toda la memoria aún está ocupada pero no es accesible.Esa es una pérdida de memoria: la memoria que está ocupada pero inutilizable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a cs.stackexchange
scroll top