Pergunta

Existe algum ponto para liberar memória em uma função atexit ()?

Eu tenho uma variável global que fica malloc'ed após a inicialização. Eu poderia escrever uma função atexit () para libertá-la, mas não é o sistema vai recuperar toda a memória que quando o programa sai de qualquer maneira?

Há algum benefício a ser arrumado e ativamente limpá-lo eu mesmo?

Foi útil?

Solução

Não em C -. É como reorganizar as cadeiras no convés enquanto o navio afunda em torno de você

Em C ++, a resposta é diferente, porque os objetos podem excluir arquivos temporários e assim por diante em seus destruidores, então você precisa se certificar aqueles get chamado.

Outras dicas

Uma das vantagens em libertá-la é que se você nunca fazer qualquer teste de vazamento de memória que tenta corresponder alocações com deallocations durante a vida útil do processo que você não vai obter falsos positivos deste tipo de vazamento deliberado.

Vendo como malloc() / free() normalmente envolvem estruturas de dados extensos que existem no espaço do usuário, free()ing memória quando suas extremidades programa pode realmente ser um dreno desempenho. Se partes da estrutura de dados são paginada para disco, eles precisam ser carregados a partir do disco apenas para ser descartado!

Considerando que se encerrar, sem free()ing, os dados paginada para disco pode morrer em paz.

É claro free()ing em outros momentos é geralmente benéfico quanto mais malloc()s pode voltar a usar o espaço que você libertados e free() pode até unmap alguma memória que pode então ser utilizado por outros processos.

Em todos os sistemas operacionais modernos, você pode seguramente assumir que toda a memória será liberada quando o programa termina.

Na verdade, ser arrumado pode ser interessante quando seu programa evolves.It forças que você escreva função de limpeza quando você criar funções de "inicialização". O benefício vem quando o programa se torna mais complexa, e você deseja reiniciar parte do programa. Se você já escreveu funções de limpeza trabalho, é menos provável que, de repente você se esqueceu alguma limpeza quando "reiniciar" parte de seu programa.

Criando funções de limpeza "preguiçosamente" ou seja, apenas quando você precisar dele é mais propenso erro de. Criando funções de limpeza força você a pensar sobre limpeza e eventual dependência de limpeza. É mais fácil permitir a reutilização de código de uma parte do seu código em outro projeto.

Então, sim libertar em uma atexit é inútil, e por isso está fechando descritor de arquivo. No entanto escrito e manter função de limpeza como o seu Código cresce pode ser uma restrição que irá forçá-lo a pensar sobre o que você está fazendo

Você deve liberar () se o seu código que está chamando atexit () faz parte da biblioteca compartilhada dinamicamente-carregado (com dlopen (), por exemplo). Neste caso, o manipulador atexit será chamado no dlclose () tempo para a pilha continuará a existir para o resto do processo para uso.

No Windows, algumas chamadas retornar memória que pertence ao sistema operacional ou para COM e você precisa para libertar a memória explícita ou não será liberado mesmo depois de suas termina processo. Mas este é um cenário raro.

não liberar memória antes de o encerramento do processo não é um vazamento de memória. é uma fuga de memória quando você perde um identificador para ele. mas a memória não é o único tipo de recurso, e outros recursos persistem entre processos (como identificadores de janela e identificadores de arquivo), então você precisa fazer para 'livre' aqueles.

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