Sobre o conceito de Alocação de Memória Dinâmica, responda:
4. Descreva um cenário em que o uso de realloc seria mais apropriado do que liberar e realocar manualmente um bloco de memória.
4. Descreva um cenário em que o uso de realloc seria mais apropriado do que liberar e realocar manualmente um bloco de memória.
Passo 1
O enunciado pede para a gente encontrar um exemplo prático — um cenário concreto — em que usar
realloc
para redimensionar um bloco de memória é melhor do que fazer manualmente um free
seguido de um malloc
e copiar os dados à mão. O conteúdo aqui é gerenciamento de memória dinâmica em C.Passo 2
A função
realloc
tenta estender ou encolher o bloco original “in place”, preservando os dados já armazenados e atualizando o ponteiro de forma segura. Se não houver espaço contíguo suficiente, ela aloca outro bloco maior, faz a cópia interna e libera o antigo. Assim, evita que você mesmo tenha que chamar malloc
para o novo tamanho, copiar byte a byte os dados e depois chamar free
no bloco antigo.Passo 3
Imagine um programa que vai ler um número desconhecido de linhas de texto (ou valores) de um arquivo ou da entrada padrão e armazená-las num vetor dinâmico de strings (ou inteiros). A cada nova linha lida, você não sabe previamente quantas linhas virão, então precisa crescer o vetor.
- Com
realloc
, basta fazer
e o conteúdo anterior já fica intacto.buffer \(=\) realloc(buffer, \(novo_tamanho\) * sizeof *buffer);
- Se você fosse liberar e realocar manualmente, teria de fazer algo como:
. salvar o ponteiro antigo,
. chamar malloc
no novo tamanho,
. memcpy
do bloco antigo para o novo,
. free
do bloco antigo,
. tratar erros em cada passo.
Isso gera código mais verboso, mais sujeito a vazamentos e cópias erradas.
Resposta
Um exemplo clássico é uma rotina de leitura dinâmica de linhas de texto ou de registros quando não se sabe quantos itens virão: a cada nova linha lida, você faz
dados \(=\) realloc(dados, quantidade\(+1\) * sizeof *dados);
para ampliar o vetor já preenchido até então. Nesse caso
realloc
cuida de preservar o conteúdo antigo, possivelmente evita cópia e reduz a chance de erros em comparação com free
malloc
memcpy
manual.