Pergunta

Eu estava olhando para um exemplo aqui: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 ler que quando executamos o programa com os seguintes argumentos:

hello this is a test

A variável string_so_far aponta para a seqüência de caracteres "hello", que foi atribuído como resultado da iteração do loop.Mas eu não entendo como?Um passo a passo de explicação seria realmente útil.

Em segundo lugar, me deparei com este exemplo no material do curso:

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

Ele afirmou que há um vazamento de memória aqui, mas eu don ' t realmente entender como, provavelmente porque eu não tenho certeza do que exatamente está acontecendo aqui.

Foi útil?

Solução

No primeiro exemplo, você pode usar malloc dentro de um loop para uma variável.O malloc chamada reserva um bloco de memória e retorna o bloco de endereços primeiro.Você precisa eliminar para bloco com free se você não precisar mais dele.Se o programador desejar prolongar o bloco de memória, a melhor alternativa seria realloc.Leia mais sobre realloc no http://www.cplusplus.com/reference/cstdlib/realloc/.

No segundo exemplo, o objeto no qual o ponteiro p aponta é inicializado na pilha e permanecerá para ficar na pilha até que o programador usa delete.Uma alternativa mais segura para a criação de objetos no heap é criar na pilha, que irá remover todos os dados, depois de um método de chamada terminar.

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

Se o gerenciamento de memória não for feito corretamente, como no segundo exemplo, o objeto não pode ser excluída após a única referência para ele for perdida, portanto, um vazamento de memória ocorre.

Outras dicas

No segundo exemplo, você alocar espaço para um PrimeSet objeto e inicializar e, em seguida, chamar o countPrimeNumbers função.O PrimeSet objeto ainda existe, ainda ocupa memória, é, provavelmente, atribuir mais memória, e todos os que a memória ainda está ocupada, mas não acessível.Que um vazamento de memória:Memória que está ocupada, mas inutilizável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a cs.stackexchange
scroll top