terminologia: vazamento de memória

5

Quando ouço o termo vazamento de memória com isso quero dizer um bug em um programa que não causa nenhum problemas exceto que não libera recursos de memória e, se fizer isso continuamente, pode consumir muita memória, prejudicar o desempenho do sistema e, no pior dos casos, travar o programa (ou outro programa, se o sistema operacional decidir escolher matar esse). / p>

Mas agora, nesta seção de comentários desta questão, os votos positivos me fizeram pensar se esse é todo o significado do termo. Eu sempre costumava usá-lo nesse sentido.

link

Então, você chamaria algo de um simples vazamento de memória que trava um programa por algum outro efeito colateral ou causa um dead-lock ao não liberar um bloqueio?

Atualizar - Nota: infelizmente algum administrador apagou a seção de comentários, então não posso mais me referir a essa discussão: /

Basicamente eu disse que um vazamento de memória é inofensivo exceto que ele consome memória (e, consequentemente, a longo prazo, a esse respeito pode ser prejudicial, travar o aplicativo / sistema). Eles disseram que isso não é verdade, com o C ++ RAII pode causar sérios problemas. - Sim, se você não excluir um objeto com algum código importante no destruidor que pode causar problemas, mas no meu vocabulário isso é um grande erro e não um vazamento de memória.

    
por Karoly Horvath 17.09.2011 / 02:36
fonte

5 respostas

5

O vazamento de memória por excelência seria exatamente o que você descreveu, a falha em liberar alguma memória alocada pelo processo. As conseqüências normalmente seriam que o programa gradualmente aumenta de tamanho enquanto está sendo executado, com possíveis efeitos secundários devido a isso. Alocações subseqüentes de memória podem falhar ou o sistema pode se comportar mal devido aos recursos desperdiçados.

No entanto, um problema pode ser descrito com precisão como um vazamento de memória, desde que, de fato, vaze memória. Também pode fazer outras coisas potencialmente mais sérias. Por exemplo, se você não conseguir fechar um fluxo de E / S padrão, isso é um vazamento de memória porque a memória associada ao fluxo será perdida. No entanto, ele também pode executar o processo fora dos descritores de arquivos ou talvez fazer com que um fluxo subsequente seja aberto devido a um limite no número de fluxos de E / S padrão.

    
por 17.09.2011 / 03:10
fonte
1

Depende. Certamente, o programa poderia ter caído devido a um vazamento de memória. Mas eu não chamaria todos os vazamentos de memória de travamentos. Um vazamento de memória tem uma definição muito clara.

Uma falha no aplicativo pode ser causada por várias coisas diferentes.

  • Exceção não tratada
  • Vazamento de memória
  • Vazamento de recursos
  • Impasse
  • Outro (bug no código)

No momento da falha, seria necessário fazer um crash / memory dump e usar algo como o Windbg para analisar o estado do código no momento da falha para determinar se era um vazamento de memória, deadlock, bug, etc.

Um vazamento de memória simplesmente não está liberando memória depois de ter terminado. Isso pode causar uma falha se os limites de recursos forem atendidos conforme você observou.

Um vazamento de recursos não está liberando o recurso depois que você terminar. Um exemplo poderia estar abrindo uma conexão de banco de dados e não fechá-la depois que você terminar.

Os deadlocks são diferentes de vazamentos, porque vazamentos podem passar despercebidos e podem ser benignos se os recursos do sistema não forem consumidos. Os deadlocks são uma condição que não se acumula com o tempo.

    
por 17.09.2011 / 04:38
fonte
0

Um significado relacionado de "vazamento de memória" se aplica a idiomas que usam coleta de lixo. Lá, a memória é suposta para vazar, mas se você não conseguir, é o mesmo problema.

    
por 17.09.2011 / 03:33
fonte
0

Vazamentos de memória acontecem Se você não conseguir excluir a memória alocada dinamicamente. Rastreamento vazamentos de memória é um dos aspectos mais demorados (e tediosos) da programação em ambientes não gerenciados.

Um exemplo simples de vazamento de memória pode estar seguindo.

int main(void)
{
    /* this is an infinite loop calling the malloc function which
     * allocates the memory but without saving the address of the
     * allocated place */
   while (malloc(50)); /* malloc will return NULL sooner or later, due to lack of memory */
   return 0;  /* free the allocated memory by operating system itself after program exits */
}
    
por 17.09.2011 / 08:28
fonte
-2

link

would you call something a simple memory leak that crashes a program by some other side-effect

Vazamentos de memória podem causar bugs aleatórios, já que a memória pode receber valores inesperados.

causing a dead-lock by not freeing a lock?

Os bloqueios mortos podem ser causados pela memória a qual foram atribuídos valores inesperados.

Outras leituras sobre este tema:

  1. link
  2. link
por 17.09.2011 / 02:40
fonte