Tenha cuidado com o Memory Leak

Se você programa em C e não sabe o que é Memory Leak, pode estar cometendo um grave erro sem perceber.

Memory Leak é um erro causado pelo próprio programador quando lida com alocação de memória dinâmica manualmente. Quando alocamos um novo espaço de memória na heap, por exemplo com a função malloc(), nós recebemos um ponteiro para o início desse novo espaço alocado.
Podemos liberar este espaço usando a função free() e passando o ponteiro para o início do espaço alocado como argumento.

Um Memory Leak ocorre quando nós simplesmente “perdemos” o ponteiro para o início de um espaço alocado dinamicamente sem antes liberarmos aquele espaço.
Como não temos mais o endereço na memória, ficamos impossibilitados de liberar aquele espaço que fica alocado até a finalização do nosso programa.

Esse tipo de erro geralmente ocorre quando alocamos memória dentro de uma função e usamos uma variável local para armazenar o endereço.
Se a função for finalizada sem antes liberarmos a memória, teremos um Memory Leak.
Como podemos ver no exemplo abaixo:

Em sua forma mais “simples”, apenas estaremos ocupando alguns bytes ou Kilobytes extras de memória. O que não chega a ser grave se o desempenho de nosso programa não for crítico.
Mas este erro pode se agravar quando o Memory Leak ocorre em uma tarefa que é executada diversas vezes em nosso programa, fazendo com que mais e mais memória seja consumida. (cof! cof! Google Chrome cof! cof!)

É claro que a dica principal para evitar o Memory Leak é usar o bendito free(), mas nem sempre precisamos incomodar a heap quando precisarmos de espaço extra para nossos dados.

A função alloca() nos permite alocar memória dinamicamente no stack frame da função, o que não apenas nos dá memória dinâmica como também nos livra da responsabilidade de usar free(), já que todo o stack frame será liberado quando a função for finalizada.
Ou seja, o risco de ocorrer um Memory Leak é simplesmente zero.

O uso da função é idêntico ao uso de malloc(). Veja o exemplo:

Isso é óbvio, mas é bom ressaltar o fato de que a stack é uma section de memória finita.
Logo, existe um limite de memória que nós podemos alocar no stack frame. Esse limite não é fixo, vai depender de quanto o seu programa já usou da stack, do sistema operacional e também da arquitetura do computador.
Se nós passarmos dos limites e alocarmos mais espaço do que podemos, irá ocorrer um stack overflow e…

Sim, uma maldita mensagem de segmentation fault é esfregada no nosso rosto. De acordo com a man page da função, o comportamento do programa é indefinido quando ocorre o stack overflow. Logo pode ocorrer outro tipo de erro ou qualquer outra coisa bizarra, como ETs invadirem o seu PC e abduzirem sua pasta cheia de vídeos… Educacionais.

Como existe essa variação referente a sistema operacional e arquitetura, o programa que você testar no seu PC pode funcionar mas dar erro em outro computador.
Portanto, para usar a função com segurança aloque apenas pouca memória no stack frame. Como para structs, arrays, inteiros etc.
Se você precisa de muita memória, use a boa e velha heap. (e não esqueça do free)

Quem quiser debater assuntos interessantes sobre programação, pode entrar no meu grupo no Facebook:

https://www.facebook.com/groups/fdcasm/

--

--

Meu nome é Luiz Felipe…. Meu GitHub: @Silva97

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store