Pergunta

Eu me sinto como desenvolvedores falar sobre vazamentos de memória, mas quando você perguntar-lhes o que isso significa muitos não têm idéia. Para evitar estas situações, vamos decidir sobre uma.

Por favor, não definições da Wikipédia ...

Qual é a sua melhor definição de um Memória vazamento e qual é a melhor maneira para impedi-los?

Foi útil?

Solução

Existem duas definições (pelo menos para mim):

definição Naive: A falha em liberar inacessível de memória, que não pode mais ser alocado novamente por qualquer processo durante a execução do processo de alocação. Esta pode na sua maioria ser curado utilizando técnicas de GC (lixo Collection) ou detectadas por ferramentas automatizadas.

definição Sutil: A falha em liberar acessível de memória que não é mais necessário para o seu programa para funcionar corretamente. Isto é quase impossível detectar com ferramentas automatizadas ou por programadores que não estão familiarizados com o código. Embora tecnicamente não é um vazamento, ele tem as mesmas implicações que o ingênuo. Este não é apenas a minha própria idéia. Você pode se deparar com projetos que são escritos em uma linguagem de lixo coletado, mas ainda mencionar o conserto de vazamentos de memória em seus changelogs.

Outras dicas

memória que não pode ser usado porque a referência a ele foi perdido atribuídos.

O processo em que recursos de memória são alocados e não devidamente divulgado quando já não são necessários, muitas vezes introduzidas através de práticas de codificação ruins.

Não são construídos de maneiras em alguns idiomas para ajudar a prevenir-los, embora a melhor maneira de evitá-los é através da observação diligente dos caminhos de execução de código e revisões de código. Mantendo métodos curto e singularmente propôs ajuda a manter o uso de recursos firmemente escopo e menos propenso a se perder no shuffle, também.

Definição : Falha para liberar memória após a alocação.

w:

Em ciência da computação, um vazamento de memória é um tipo particular de consumo de memória involuntária por um programa de computador onde o programa não consegue liberar memória quando não for mais necessária. Esta condição é normalmente o resultado de um bug em um programa que o impede de liberar memória que não precisa de mais tempo.

Memória que não é desalocada quando não é mais necessária, e não é mais "acessível". Por exemplo, no código não gerenciado, se eu usar o "novo" para instanciar um objeto, mas eu não uso "delete" quando eu sou feito com ele (e meu ponteiro passou fora do escopo ou algo assim).

A melhor maneira de evitar que eles provavelmente depende de quem você perguntar e o idioma que você está usando. A coleta de lixo é uma boa solução para isso, é claro, mas pode haver alguma sobrecarga associada a esta, que não é um grande negócio, a menos que o desempenho é a sua principal preocupação. A coleta de lixo pode não estar sempre disponível, mais uma vez, dependendo do idioma que você está usando.

Como alternativa, você pode ter certeza de que as exclusões e / ou destruidores apropriadas no lugar. Há uma série de métodos e ferramentas para detectar vazamentos de memória, bem como, mas isso vai depender da linguagem e / ou IDE você está usando.

vazamento de memória : Na falta de memória livre que você não precisa mais antes de qualquer um:

  • Os termina programa
  • A memória adicional é alocada

melhor maneira de prevenir vazamentos de memória :. Memória livre assim que não é mais necessário

Há duas maneiras de um vazamento de memória podem ser definidas.

Em primeiro lugar, se os dados não é liberada quando há já não tem quaisquer referências a ele são, que os dados está inacessível (a menos que você tenha algum ponteiro corrompido ou ler passado os dados em um buffer ou algo assim). Basicamente, se você fizer dados não livres / apagar alocados na pilha, torna-se memória inutilizável e simplesmente resíduos.

Pode haver casos em que um ponteiro está perdido, mas os dados ainda está acessível. Por exemplo, se você armazenar o ponteiro em um int, ou armazenar um deslocamento para o ponteiro (usando ponteiro aritmética), você ainda pode obter a volta ponteiro originais.

Nesta primeira definição, os dados são manipulados por catadores de lixo, que mantêm o controle do número de referências aos dados.

Em segundo lugar, a memória é essencialmente vazou se não for libertado / excluído quando usado pela última vez. Ele pode ser referenciado e, imediatamente, sem poder, mas o erro foi feito para não fazê-lo. Pode haver uma razão válida (por exemplo no caso em que um destruidor tem algum efeito colateral estranho), mas que indica má concepção do programa (na minha opinião).

Este segundo tipo de vazamento de memória muitas vezes acontece quando escrever pequenos programas que usam arquivo IO. Você abre o arquivo, escrever seus dados, mas não fechá-lo uma vez que você está feito. O FILE * pode ainda estar dentro do escopo e facilmente closeable. Mais uma vez, pode haver alguma razão para fazer isso (como o bloqueio acesso de escrita por outros programas), mas para mim isso é uma bandeira do design ruim.

Nesta segunda definição, os dados não são manipulados por coletores de lixo, a menos que o compilador / intérprete é inteligente (ou mudo) o suficiente para saber que não serão utilizados por mais tempo, e isso libertando os dados não irá causar qualquer lado efeitos.

Aqui estão algumas técnicas de prevenção / detecção de vazamentos de memória:

  1. Considere o seu algoritmo em termos de consumo de memória. Outros entrevistados mencionaram o fato de que você não tem que perder o ponteiro para um item destinado a vazar memória. Mesmo que a sua implementação contém zero erros de ponteiro, você ainda pode efetivamente vazar memória se agarrar itens alocados muito depois que você realmente precisa deles.

  2. Perfil sua aplicação. Você pode usar ferramentas de depurador de memória como Valgrind ou Purify para localizar vazamentos.

  3. caixa-preta de teste. Veja o que acontece com o seu código compilado depois de alimentá-lo grandes conjuntos de dados, ou permitir que ele seja executado por longos períodos de tempo. Veja se o seu consumo de memória tem uma tendência a crescer sem limite.

Todas as definições dadas aqui (na época eu escrevi isto, temos obtido respostas melhores desde então) não conseguem resolver um caso limite:

Você tem um singleton que aloca memória na criação e essa memória é normalmente realizada enquanto o programa está sendo executado mesmo que o uso atual é feito e não se sabe se qualquer uso futuro nunca vai ser feito ou não. Isso geralmente é feito por causa da sobrecarga de recriá-lo.

Por "deixar de libertar quando feito com ele" padrão isso seria considerado um vazamento e eu vi ferramentas de relatórios de vazamento de chamar tais coisas vazamentos como a memória ainda estava em uso. (E, na verdade o código não pode conter código capaz de limpar o objeto para cima.)

código No entanto, tenho encontrado desta natureza em bibliotecas de compilador antes mesmo quando o custo de recriar o objeto não é tão grande.

Vazamento ou não?

edit: Esta resposta está errada. Eu estou deixando-o como um exemplo de como é fácil ser confundido sobre algo que você acha que sabe muito bem. Obrigado a todos que apontou meu erro.

Um vazamento de memória é: Um erro de programação. Seu software empresta alguma memória do sistema, utiliza-lo, e, em seguida, deixa de devolvê-lo para o sistema quando ele tiver terminado. Isso significa que esse pedaço particular de memória nunca podem ser usados ??por todos os outros programas até que o sistema seja reiniciado. Muitos desses vazamentos poderia usar-se toda a memória disponível, resultando em um sistema completamente inútil.

Para evitar vazamentos de memória, prática RIIA, e sempre testar o seu software. Há uma abundância de ferramentas disponíveis para esta tarefa.

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