Vazamento de memória: diferenças entre revisões

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
SieBot (discussão | contribs)
m Bot: Adicionando: sk:Memory leak
YonaBot (discussão | contribs)
m Bot: Modificando: zh:内存泄漏
Linha 72: Linha 72:
[[ru:Утечка памяти]]
[[ru:Утечка памяти]]
[[sk:Memory leak]]
[[sk:Memory leak]]
[[zh:記憶體裂縫]]
[[zh:内存泄漏]]

Revisão das 09h53min de 18 de abril de 2007

Memory leak, ou vazamento de memória, é um fenômeno que ocorre em sistemas computacionais quando uma porção de memória precisa ser alocada para uma determinada operacão, mas não é liberada depois. A existência de memory leak é considerada um grave erro de programacão que pode transformar um software em um grande consumidor de memória RAM.

Considere o codigo abaixo:

main()
{
	char *p1;
	char *p2;

	p1 = (char *)malloc(1024);
	p2 = (char *)malloc(1024);

	if(p1 == NULL || p2 == NULL) return -1;

	free(p1);
	free(p2);
}

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.

Vejamos agora uma versão que trata essa falha:

main()
{
	char *p1;
	char *p2;

	p1 = (char *)malloc(1024);
	p2 = (char *)malloc(1024);

	if(p1 == NULL || p2 == NULL){
		free(p1);
		free(p2);
		return -1;
	}
	
	free(p1);
	free(p2);
}

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.

É 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.