Um vazamento de memória é um tipo de programação bug que ocorre quando um programa aloca mais memória do que ele libera . Desta forma , um aplicativo pode ficar sem memória e fazer com que o sistema deixe de funcionar. Para evitar vazamentos de memória , você precisa saber quando eles ocorrem com mais frequência e ser consciente com o uso dos operadores de C + + "novo" e "delete" . Coisas que você precisa
Proficiência em C + + compilador
C + +
depurador e outras ferramentas de software de investigação
Show Mais instruções
1
Entenda o básico do operador. O operador C + + "novo" aloca memória heap. O operador "delete" libera memória heap. Para cada " novo", você deve usar um "delete " para 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 ponto str lugar nenhum
2
realocar a memória somente se você tiver excluído . . No código abaixo , str adquire um novo endereço com a segunda alocaçã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 comentário nesta linha para corrigir
str = new char [ 60] ; /.. /Dê str outro endereço de memória com o primeiro foi para sempre
delete [ ] str //isso exclui o 60 bytes , e não apenas os primeiros 30 .
3
Assista as atribuições do 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 de seu ponteiro (s), torna-se impossível de apagar. Mais uma vez , isso resulta em um vazamento de memória :
char * str1 = new char [ 30];
char * str2 = new char [ 40] ;
strcpy ( str1 , " vazamento de memória" ) ;
str2 = str1 //Bad ! Agora, os 40 bytes são impossíveis de livre
delete [ ] str2 ; . //Isso elimina os 30 bytes
delete [ ] str1 ; . Violação //acesso possível . Que desastre !
4
Tenha cuidado com ponteiros locais. Um ponteiro de declarar em uma função é alocada na pilha , mas a variável dinâmica que aponta para é alocado no heap. Se você não apagá-lo, ele irá persistir após o programa sai da função:
vazio Leak (int x ) {
char * p = new char [ x] ;
//delete [ ] p //Remova a primeira marcação para corrigir comentário
}
5
Preste atenção aos colchetes depois . "delete ". Use "delete" , por si só para libertar um único objeto. Use "delete" [] com colchetes para libertar uma matriz heap. Não faça algo assim:
char * um = new char ;
delete [ ] um; //errado
char * muitos = new char [ 30];
excluir muitos ; ! //errado