Um vazamento de memória é um tipo de bug de programação que ocorre quando um programa aloca mais memória do que ele libera. Desta forma, um aplicativo pode ficar sem memória e causar a falha do sistema. Para evitar vazamentos de memória, você precisa saber quando eles ocorrem com mais frequência e ser consciente com o uso do "Novo" e "excluir" operadores C ++.
Coisas que você precisa
- Proficiência em C ++
- compilador C ++
- Depurador e outras ferramentas de software de investigação
instruções
Compreender os conceitos básicos do operador. O operador do C ++ "Novo" aloca memória heap. o "excluir" operador libera memória heap. Para cada "Novo," você deve usar um "excluir" de modo que você liberar a mesma memória que você alocado:
char * str = new char [30] - // alocar 30 bytes para abrigar uma string.
delete [] STR-// Limpar esses 30 bytes e fazer str apontar a lugar nenhum.Realocar a memória somente se você tiver excluído. No código abaixo, str adquire um novo endereço com a segunda dotação. O primeiro endereço é perdido irremediavelmente, e por isso são os 30 bytes que apontavam para. Agora eles são impossíveis de livre, e você tem um vazamento de memória:
char * str = new char [30] - // dê str um endereço de memória.
// Delete [] STR-// Remove a primeira marcação nesta linha para corrigir comentários.
str = new char [60] - // dê str outro endereço de memória com o primeiro foi para sempre.
delete [] STR-// Isso exclui os 60 bytes, não apenas o primeiro 30.Cuidado com os trabalhos de ponteiro. Cada variável dinâmica (memória alocada no heap) precisa ser associado com um ponteiro. Quando uma variável dinâmica torna-se dissociado do seu ponteiro (s), torna-se impossível de apagar. Mais uma vez, isto resulta em uma perda de memória:
carbonizar str1 = new char [30] -
carbonizar str2 = new char [40] -
strcpy (str1, "Vazamento de memória") -
str2 = str1- // Bad! Agora, os 40 bytes são impossíveis de se libertar.
delete [] str2- // Isso exclui os 30 bytes.
delete [] str1- // Possível violação de acesso. Que desastre!Tenha cuidado com ponteiros locais. Um ponteiro você declarar em uma função é alocada na pilha, mas a variável dinâmica ele aponta para é alocado na pilha. Se você não excluí-lo, ele irá persistir após o programa sai da função:
anular Leak (int x) {
char * p = new char [x] -
// Delete [] p // Remove a primeira marcação para corrigir comentários.
}Preste atenção aos colchetes após "excluir." Usar "excluir" por si só, para libertar um único objeto. Usar "excluir" [] Com colchetes para libertar uma matriz de heap. Não faça algo parecido com isto:
carbonizar um = new char-
delete [] um- // errado
carbonizar muitos = new char [30] -
eliminar muitos-// errado!
dicas & avisos
- Evite misturar C e C ++. Use o novo e excluir ou usar malloc () e free (). Sob nenhuma circunstância usar nova com free () ou malloc () com delete.