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çãoC 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
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()
malloc() leva um único argumento (a quantidade de memória a ser alocada em bytes), enquanto calloc() 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, enquanto calloc() 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
malloc
A função malloc possui o seguinte protótipo:
void*malloc(size_tsize);
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
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(tipon_elementos,tipoelementoTamanho);
Problemas
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.