Diferenças entre edições de "Vazamento de memória"

507 bytes adicionados ,  18h17min de 5 de janeiro de 2007
Cds
(Cds)
{{revisão}}
'''Memory Leaksleak''', ou vasamento'''vazamento de memória''', ocorremé um fenômeno que ocorre em situacões[[sistema computacional|sistemas computacionais]] ondequando uma porcãoporção de memória precisa ser alocada para uma determinada operacão, mas não é liberada depois. MemoryA Leaksexistência sãode graves''memory errosleak'' é considerada um grave erro de programacão que podempode transformar oum ''software'' em um grande devoradorconsumidor de [[memória RAM]].
 
Considere o codigo abaixo:
</pre>
 
No exemplo são declarados 2 ponteiros para um tipo char, logo em seguida é alocado 1024 bytes para cada ponteiro e é feito um teste para ver se em algum momento a alocacão dinamica de memória falhou. Caso a alocacão tenha falhado para algum dos ponteiros o programa é abortado. Poderia ter acorrido uma falha de alocacão se não houvesse memória suficiente disponivel. Logo abaixo do 'if' a memoria alocada é liberada.
 
Agora vamos ao problema!
Imagine que a memoria para *p1 tenha sido alocada com sucesso, mas por algum motivo desconhecido, o mesmo não ocorreu para *p2. Quando algum erro de alocacão ocorre, o valor retornado ao ponteiro é NULL.
O operador 'if' ira verificar se o valor de *p1 é igual a NULL e fará o mesmo para *p2, como o valor de *p2 de fato é NULL o programa ira ser abortado, observe que as instrucoes 'free', utilizadas para liberar a memória previamente alocada, nunca serão executadas e memoria alocada para *p1 nunca será liberada.
 
O operador 'if' ira verificar se o valor de *p1 é igual a NULL e fará o mesmo para *p2, como o valor de *p2 de fato é NULL o programa ira ser abortado, observe que as instrucoes 'free', utilizadas para liberar a memória previamente alocada, nunca serão executadas e memoria alocada para *p1 nunca será liberada.
Vejamos agora uma versão que trata essa falha:
 
Vejamos agora uma versão que trata essa falha:
<pre>
main()
}
</pre>
No programa acima, caso alguma instrucão 'malloc' tenha falhado, a instrucão 'free' á executada e somente depois disso o 'return'. Caso o valor dos ponteiros seja NULL, a instrucão 'free' não fará nada.
Abaixo do 'if' as instrucões 'free' são repetidas para que a memória alocada seja liberada caso nao acorra erros.
 
No programa acima, caso alguma instrucão 'malloc' tenha falhado, a instrucão 'free' á executada e somente depois disso o 'return'. Caso o valor dos ponteiros seja NULL, a instrucão 'free' não fará nada.
É claro que esse exemplo é muito simples, uma falha assim seria rapidamente encontrada e corrigida. Mas esse tipo de falha ocorre em varios programas conhecidos, como o Apache entre outros.
 
Imagine esse tipo de acontecimento dentro de um loop, muita memória seria desperdicada, e em pouco tempo
Abaixo do 'if' as instrucões 'free' são repetidas para que a memória alocada seja liberada caso nao acorra erros.
consumiria toda a memória disponivel do sistema.
 
É claro que esse exemplo é muito simples, uma falha assim seria rapidamente encontrada e corrigida. Mas esse tipo de falha ocorre em varios programas conhecidos, como o Apache entre outros.
 
Imagine esse tipo de acontecimento dentro de um loop, muita memória seria desperdicada, e em pouco tempo consumiria toda a memória disponivel do sistema.
 
[[Categoria:Programação]]
 
[[ar:تسرب الذاكره]]
[[de:Speicherleck]]
[[en:Memory leak]]
[[es:Fuga de memoria (informática)]]
[[fi:Muistivuoto]]
[[he:דליפת זיכרון]]
[[it:Memory leak]]
[[ja:メモリリーク]]
[[ko:메모리 누수]]
[[lt:Atminties nutekėjimas]]
[[nl:Geheugenlek]]
[[pl:Wyciek pamięci]]
[[ru:Утечка памяти]]
[[zh:記憶體裂縫]]
22 741

edições