Como prevenir vazamentos de memória no C++

Escrito por ehow contributor | Traduzido por lucas irineu
  • Compartilhar
  • Tweetar
  • Compartilhar
  • Pin
  • E-mail
Como prevenir vazamentos de memória no C++
Prevenir vazamentos de memória em C++ é fácil (Programming Code Source Background Texture Illustration Design image by Bob Davies from Fotolia.com)

Um vazamento de memória é um tipo de erro de programação que ocorre quando um programa aloca mais memória do que ele libera. Dessa forma, o aplicativo pode ficar sem ela e causar um erro no sistema. Para prevenir vazamentos desse tipo, você precisa saber quando eles ocorrem mais frequentemente e entender como utilizar os operadores "new" e "delete" do C++.

Nível de dificuldade:
Moderadamente desafiante

Outras pessoas estão lendo

O que você precisa?

  • Conhecimento em C++
  • Compilador de C++
  • Depurador e outras ferramentas de investigação de software.

Lista completaMinimizar

Instruções

  1. 1

    Entenda como os operadores funcionam. O operador do C++ "new" aloca memória. O "delete" libera ela. Para cada "new", você deve usar um "delete", para que assim você libere a mesma quantidade de memória que você alocou:

    char* str = new char [30]; // Aloque 30 bytes para guardar uma cadeia de carácteres. delete [] str; // Libere os 30 bytes e faça str apontar para vazio.

  2. 2

    Realoque mais memória apenas se você já tenha liberado ela. No código abaixo, str aponta para um novo endereço com a segunda alocação. O primeiro endereço é perdido irrecuperavelmente, e com ele os 30 bytes para os quais ele apontava. Agora eles são impossíveis de se liberar e você tem um vazamento de memória:

    char* str = new char [30]; // Dá a str um novo endereço de memória // delete [] str; // Remova o primeiro marcador de comentário dessa linha para corrigir o código. str = new char [60]; // Dá a str outro endereço de memória, perdendo o primeiro para sempre. delete [] str; // Isso deleta os 60 bytes alocados por último, não os 30 alocados primeiro.

  3. 3

    Tome cuidado com as definições de ponteiros. Cada variável dinâmica(memória alocada na heap) precisa ser associada a um deles. Quando uma variavel assim fica desassociada de seus ponteiro(s), ela se torna impossível de se apagar. Novamente, 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; // Ruim! Agora os 40 bytes não podem ser liberados! delete [] str2; // Isso deleta os 30 bytes. delete [] str1; // Possivelmente, uma violação de acesso. Que desastre!

  4. 4

    Tome cuidado com ponteiros locais. Um ponteiro que você declara em uma função é alocado na pilha, mas a variável dinâmica para o qual ele aponta é alocada na heap. Se você não deletá-la, ela vai continuar existindo depois que o programa sair da função:

    void Vazamento(int x){ char* p = new char [x]; // delete [] p; // Remova o primeiro marcador de comentário para corrigir. }

  5. 5

    Preste atenção aos colchetes depois do "delete". Use ele sozinho para liberar um único objeto. Use "delete []" para liberar um vetor de objetos.

    Não faça coisas assim:

    char um = new char; delete [] um; // Errado. char varios = new char [30]; delete varios; // Errado!

Dicas & Advertências

  • Procure não misturar C e C++. Use new e delete, ou então use malloc() e free(). Nunca use new com free() ou malloc() com delete.

Não perca

Filtro:
  • Geral
  • Artigos
  • Slides
  • Vídeos
Mostrar:
  • Mais relevantes
  • Mais lidos
  • Mais recentes

Nenhum artigo disponível

Nenhum slide disponível

Nenhum vídeo disponível