Domanda

.
Chiuso. Questa domanda è off-topic . Attualmente non accetta risposte.

Vuoi migliorare questa domanda? Aggiorna la domanda quindi è On-topic per lo scambio di pila di scienze informatiche.

chiuso 5 mesi fa .

Stavo guardando un esempio qui: 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);
}
.

e leggi che quando eseguiamo il programma con i seguenti argomenti:

hello this is a test
.

La variabile stringa_so_far punta alla stringa "Ciao" che è stata assegnata come risultato della precedente iterazione del loop. Ma non capisco come? Una spiegazione passo dopo passo sarebbe davvero utile.

In secondo luogo, mi sono imbattuto in questo esempio in materiale:

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

È stato affermato che c'è una perdita di memoria qui ma non capisco davvero come, probabilmente perché non sono sicuro di cosa sta succedendo esattamente qui.

È stato utile?

Soluzione

Nel primo esempio, si utilizza malloc all'interno di un loop per una variabile. La chiamata malloc si riserva un blocco di memoria e restituisce il primo indirizzo del blocco. È necessario eliminare per bloccare con free se non ne hai più bisogno. Se il programmatore desidera estendere il blocco di memoria, l'alternativa migliore sarebbe realloc. Maggiori informazioni su realloc at http://www.cplusplus.com/reference/cstdlib/realloc/ .

Nel secondo esempio, l'oggetto in cui il puntatore p punta è inizializzato sull'heap e rimarrà per rimanere nell'heap fino a quando il programmatore utilizza delete. Un'alternativa più sicura per la creazione di oggetti sul mucchio è la creazione della pila, che rimuoverà ogni dato dopo che la chiamata di un metodo è terminata.

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

Se la gestione della memoria non viene eseguita correttamente nel secondo esempio, l'oggetto non può essere cancellato dopo che l'unico riferimento ad esso è perso, quindi avviene una perdita di memoria.

Altri suggerimenti

Nel secondo esempio, allocare lo spazio per un oggetto PrimeSet e inizializzarlo, quindi chiami la funzione ConnetPrimEnCers.L'oggetto Primeset esiste ancora, occupa ancora la memoria, probabilmente ha assegnato più memoria e tutto ciò che la memoria è ancora occupata ma non accessibile.Questa è una perdita di memoria: memoria occupata ma inutilizzabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top