MALLOC(3)

NOME
calloc, malloc, free, realloc - alocam e liberam memória dinâmica

SINÓPSE
#include <stdlib.h>

void *calloc(size_t nmemb, size_t tamanho);
void *malloc(size_t tamanho);
void free(void *ptr);
void *realloc(void *ptr, size_t tamanho);

DESCRIÇÃO
calloc() aloca memória para uma matriz de nmemb elementos de tamanho bytes cada e retorna um ponteiro à memória alocada. A memória é definida para zero.

malloc() aloca tamanho bytes cada e retorna um ponteiro à memória alocada. A memória não é apagada.

free() libera o espaço de memória apontado por ptr, o qual precisa ter sido retornado por uma chamada anterior para malloc(), calloc() ou realloc(). Caso contrário, ou se free(ptr) já tenha sido chamada antes, um comportamento indefinido ocorre. Se ptr for NULO, nenhuma operação será executada.

realloc() altera o tamanho do bloco de memória apontado por ptr para tamanho bytes. O conteúdo não será alterado para o mínimo dos tamanhos antigo e novo; a memória recém-alocada não será inicializada. Se ptr for NULO, a chamada será equivalente a malloc(tamanho); se o tamanho for igual a zero, a chamada será equivalente a free(ptr). A menos que ptr seja NULO, ele precisa ter sido retornado por uma chamada anterior para malloc(), calloc() ou realloc().

VALORES RETORNADOS
Para calloc() e malloc(), o valor retornado é um ponteiro à memória alocada, a qual é adequadamente alinhada para qualquer tipo de variável, ou NULO se o pedido falhar.

free() não retorna nenhum valor.

realloc() devolve um ponteiro à memória alocada, a qual é adequadamente alinhada para qualquer tipo de variável e pode ser diferente de ptr, ou NULO se o pedido falhar ou se o tamanho for igual a 0. Se realloc() falhar, o bloco original não é alterado - ele não é liberado nem movido.

DE ACORDO COM
ANSI-C.

VEJA TAMBÉM
brk(2).

NOTAS
O padrão Unix98 requer que malloc(), calloc(), e realloc() definam errno para ENOMEM quando houver falha. A Glibc assume que isso é feito (e as versões glibc destas rotinas fazem isso); se você usar uma implementação particular de malloc que não defina errno, então determinadas rotinas de biblioteca podem apresentar problemas sem mostrar os motivos em errno.

Problemas em malloc(), free() ou realloc() quase sempre são relacionados a corrupção de 'heap', como estouro de capacidade ("overflowing"), alocações ilegais ("allocated chunk") ou a liberação duas vezes de um mesmo ponteiro.

Versões recentes da libc do Linux (posteriores a 5.4.23) e da libc GNU (2.x) incluem uma implementação da malloc ajustável através de variáveis de ambiente. Quando MALLOC_CHECK_ é definida, uma implementação especial (menos eficiente) é usada, a qual foi projetada para ser tolerante a erros simples, como chamadas a free() com o mesmo argumento, ou saturações (overruns) de um único byte (erros "off-by-one"). Porém, não é possível haver proteção para todos os erros como esses, então é possível ocorrer "vazamentos" ("leaks") de memória. Se MALLOC_CHECK_ for definida para 0, qualquer corrupção de heap é silenciosamente ignorada; se definida para 1, um diagnóstico e exteriorizado para stderr; se definida para 2, abort() é imediatamente chamada. Isso pode ser útil pois, caso contrário, se acontecer algum problema posteriormente, o motivo real dele seria muito difícil de ser rastreado.

O Linux segue uma estratégia otimista de alocação de memória. Isso significa que, quando malloc() retorna valores diferentes de NULO não há garantia de que a memória realmente seja disponibilizada. No caso de o sistema ficar sem memória, um ou mais processos serão destruídos pelo infame matador OOM killer.

TRADUZIDO POR LDP-BR em 15/06/2001.

  Tradução:
E. A. Tacão <tacao@conectiva.com.br>

  Revisão.:
André Luiz Fassone <lonely_wolf@ig.com.br>