Alocação dinâmica de memória em C
Alocação dinâmica de memória em C se refere à execução de gerenciamento manual de memória para alocação dinâmica de memória na linguagem de programação C por meio de um grupo de funções na biblioteca padrão do C, que são malloc, realloc, calloc e freefree.[1][2][3]
A linguagem de programação C++ inclui essas funções; no entanto, os operadores new e delete fornecem funcionalidade semelhante e são recomendados pelos autores desse idioma.[4] Ainda assim, existem várias situações em que o uso de new/delete
não é aplicável, como código de coleta de lixo (garbage collection) ou código sensível ao desempenho, e uma combinação de malloc
e placement new
pode ser necessária em vez do operador new
de alto nível. malloc é um termo da computação que designa uma função da biblioteca padrão das linguagens de programação C e C++ para requisitar alocação dinâmica de memória. É uma forma abreviada de escrever memory allocation (alocação de memória).
Funções
[editar | editar código-fonte]As funções de alocação de memória dinâmica em C são definidas no header stdlib.h
(header cstdlib
em C++).[1]
Função | Descrição |
---|---|
malloc
|
aloca o número especificado de bytes |
realloc
|
aumenta ou diminui o tamanho do bloco de memória especificado, movendo-o se necessário |
calloc
|
aloca o número especificado de bytes e os inicializa para zero |
free
|
libera o bloco especificado de memória de volta para o sistema |
Diferenças entre malloc()
e calloc()
[editar | editar código-fonte]malloc()
leva um único argumento (a quantidade de memória a ser alocada em bytes), enquantocalloc()
precisa de dois argumentos (o número de variáveis a serem alocadas na memória e o tamanho em bytes de uma única variável).
malloc()
não inicializa a memória alocada, enquantocalloc()
garante que todos os bytes do bloco de memória alocado foram inicializados para 0.
- Em alguns sistemas operacionais,
calloc()
pode ser implementado apontando inicialmente todas as páginas dos endereços virtuais da memória alocada para uma página somente leitura somente com 0s, e apenas alocando páginas físicas de leitura e escrita quando os endereços virtuais são escritos, um método denominado cópia em gravação.
Uso
[editar | editar código-fonte]malloc
[editar | editar código-fonte]A função malloc possui o seguinte protótipo:
void *malloc(size_t size);
Recebendo como parâmetro o tamanho em bytes da região a ser alocada e retornando um ponteiro para a área alocada. Se ocorrer um erro ao alocar memória, retorna um ponteiro para NULL.
O exemplo de código na linguagem C a seguir pede a alocação dinâmica de um vector de inteiros com vinte e cinco posições, altera o valor na posição dez e depois libera a área de memória.
int *vector = NULL; /* declaração do ponteiro */
vector = (int*) malloc(25 * sizeof(int)); /* alocação de memória para o vector */
vector[10] = 34; /* altera o valor da posição dez para trinta e quatro */
free(vector); /* liberta a área de memória alocada */
calloc
[editar | editar código-fonte]calloc é uma função da biblioteca stdlib.h, da linguagem de programação C. Seu objetivo é criar um vetor de tamanho dinâmico, ou seja, definido durante a execução do programa. Difere da função malloc, também de C, pois além de inicializar os espaços de memória ainda atribui o valor 0 (zero) para cada um deles. É útil, pois em C quando se declara um variável o espaço no mapa de memória usado por esta provavelmente contém algum valor lixo.
Sua sintaxe é:
void *calloc(tipo n_elementos, tipo elementoTamanho);
Problemas
[editar | editar código-fonte]O uso de memória dinâmica administrada pelo próprio programador abre a possibilidade para a ocorrência de problemas relativos ao mau uso da memória que muitas vezes geram vulnerabilidades de segurança e erros de difícil localização. Entre os problemas mais comuns estão:
- Vazamento de memória: ter uma região de memória alocada porém sem ponteiros para ela o que impede sua libertação
- Buffer overflow: escrever na memória para além do limite da área alocada
- Uso de áreas liberadas: escrever numa região da memória que já foi libertada por free
- Falha do malloc: se não houver memória disponível, o malloc irá falhar
Há ferramentas especializadas para detectar problemas desta natureza como o Valgrind.
Referências
- ↑ a b ISO/IEC 9899:1999 specification (PDF). [S.l.: s.n.] p. 313, § 7.20.3 "Memory management functions"
- ↑ Godse, Atul P.; Godse, Deepali A. (2008). Advanced C Programming. p. 6-28: Technical Publications. 400 páginas. ISBN 978-81-8431-496-0
- ↑ Summit, Steve. «Chapter 11: Memory Allocation». C Programming Notes. Consultado em 11 de julho de 2020
- ↑ Stroustrup, Bjarne (2008). Programming: Principles and Practice Using C++. 1009, §27.4 Free store: Addison Wesley. 1236 páginas. ISBN 978-0-321-54372-1