Ir para conteúdo
Fórum Script Brasil
  • 0

Desalocação de memória


viniciusams

Pergunta

E ae pessoal,

espero que me ajudem nessa dúvida.

Tenho o seguinte método sintetizado:

S16 teste(teste_t **testeList){
    S8 *PTR;
    teste_t *lista;
    ...
        //aloca memoria para a lista
        lista = (teste_t *) calloc (lines * columns, sizeof (teste_t ));

        // verify all lines 
        for (i = 0; i < lines; i++) {
            // verify all columns in this line
            for (j = 0; j < columns; j++) {

        ...

                    PTR = (S8 *) malloc (sizeof(S8[20]));
                    getValue(j, PTR);
                    lista[i].number.present = TRUE;
                    lista[i].number.value = PTR;
                }
            }
        }
    
   *testeList = lista;
   
    return SUCCESS;
}

A minha dúvida é:

Quando o cliente do meu método liberar memoria do testeList ( free(testeList) ), irá automaticamente liberar também de lista? e dos PTR gravados em cada campo de lista?

Se alguém não entendeu me fala que eu explico de novo.

Valeu desde já

Editado por viniciusams
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Sim, pois ele terá acesso aos ponteiros. Mas uma lembrança: o cliente terá de desalocar de dentro pra fora. Ou seja, primeiros os ponteiros das colunas (PTR) e só no final o de lista.

Uma dúvida: porque o argumento é um ponteiro de ponteiro? É uma matriz de ponteiros?

Link para o comentário
Compartilhar em outros sites

  • 0

Entendi, então um simples free(testeList) não libera tudo.

Deve liberar primeiro os PTR da coluna e depois o testeList? Como faz isso?

Cara é sim uma matriz pra ponteiro, eu sou iniciante em C e foi uma solução que eu encontrei para eu passar para o cliente do meu método uma matriz preenchida com valores...

Link para o comentário
Compartilhar em outros sites

  • 0
Entendi, então um simples free(testeList) não libera tudo.
Veja que, num programa rodando num sistema com muita memória, você pode até nem desalocar coisa alguma. Dificilmente você terá problema. Mas o método "canônico" é liberar tudo o que foi alocado. Quando você aloca memória, o gerenciador de memória (existe um) alocará o valor pretendido e devolverá um ponteiro. Então, mesmo que o ponteiro PTR esteja numa área de memória alocada por "lista", ao desalocar "lista", PTR continuará ocupando memória. Logo, você precisa desalocar tudo manualmente, do mesmo modo como fez para alocar. Um ponteiro não tem nada a ver com a memória apontada por outro ponteiro.

Porque desalocar de "revestrés"? Simples: se desalocasse primeiro "lista", você teria liberado uma área que, num sistema multithread (como o Windows) poderia ser ocupada rapidamente por outro programa (ou mesmo numa thread no mesmo programa), e antes que tivesse chance de desalocar os PTR. Mais uma vez: é muito difícil isso acontecer. Mas como "shit happens", usa-se o método canônico: antes de perder o ponteiro de "lista", desaloque os PTR. Assim, inclusive, seu programa se tornará mais thread-safe.

Deve liberar primeiro os PTR da coluna e depois o testeList? Como faz isso?

Use a mesma malha que você fez para alocar. Navegue por cada ítem "coluna" e libere seu PTR. Ao final, libere o ponteiro que sobrou. Ou seja, "lista".

Editado por Maligno
Link para o comentário
Compartilhar em outros sites

  • 0

Entendi sim maligno!

agora, você teria uma sugestão de desalocar memoria no proprio metodo?

porque é uma API e não queria passar esse trabalho para o meu cliente, então queria desalocar os PTR no proprio metodo.

Mas todas as tentativas minhas foram em vão.

Dessa forma, o cliente desalocaria apenas a lista...

Link para o comentário
Compartilhar em outros sites

  • 0

Estamos falando de C ou C++?

Se for C++, fica muito mais fácil, embora mais trabalhoso para montar a classe. Nesse caso o cliente apenas instancia o objeto que por sua vez trata de alocar a memória. Essa função, ao finalizar ou mesmo após o objeto perder escopo dentro dela, automaticamente disparará a execução do método destrutor; local apropriado para a liberação da memória.

Agora se for C, não haveria como. Até porque, a função teste() precisa retornar o ponteiro de lista. O cliente da função é que terá de liberar a memória manualmente. Se bem que isso é um procedimento absolutamente normal, de uso comum.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...