Gerenciamento de memória dinâmica
Storage dinâmico é necessário quando tamanho ou lifetime não são conhecidos na compilação.
O que é Gerenciamento de memória dinâmica?
Storage dinâmico é necessário quando tamanho ou lifetime não são conhecidos na compilação.
Aloque um array em runtime e libere corretamente.
Pontos importantes
- Todo ponteiro deve apontar para objeto vivo compatível ou ser null.
- Libere exatamente uma vez cada alocação própria.
- Expresse ownership e const claramente.
Exemplos de código C e C++
main.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
size_t count = 5;
int *values = calloc(count, sizeof *values);
if (!values) return 1;
for (size_t i = 0; i < count; ++i) values[i] = (int)(i * i);
printf("last=%d\n", values[count - 1]);
free(values);
return 0;
}
last=16
C++
main.cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> values(5);
for (std::size_t i = 0; i < values.size(); ++i) values[i] = static_cast<int>(i * i);
std::cout << "last=" << values.back() << '\n';
}
last=16
Comparação entre C e C++
C combina malloc/calloc com free e verifica falha; std::vector possui e libera automaticamente, inclusive com exceptions.
C
Ownership e limpeza são convenções manuais.
C++
Containers e RAII codificam ownership e limpeza no lifetime.
Exercícios práticos
Execute as duas versões e modifique-as para observar suas garantias.
- Teste null e falhas de alocação.
- Use AddressSanitizer e UndefinedBehaviorSanitizer.
- Documente o ownership de cada ponteiro.