# Alocação de memória
> [!NOTE] Alocação de memória
> **Alocação de memória** refere-se ao processo pelo qual todos os programas gerenciam e utilizam a memória de um computador enquanto estão em execução.
Este processo envolve:
- **Reservar espaço:** Adquirir blocos de memória para armazenar dados e instruções que o programa precisa.
- **Gerenciar uso:** Acompanhar quais partes da memória estão em uso e quais estão livres.
- **Liberar espaço:** Liberar memória que não é mais necessária para que possa ser reutilizada por outras partes do programa ou por outros programas.
Diferentes linguagens de programação lidam com a alocação de memória de várias maneiras:
- Algumas linguagens usam **coleta de lixo** (garbage collection), que identifica e recupera automaticamente a memória que não está mais em uso.
- Outras linguagens exigem que o programador **aloque e libere explicitamente** a memória.
- Linguagens como [[Rust language|Rust]] usam um sistema de **propriedade** (ownership) com regras verificadas pelo compilador para gerenciar a memória, garantindo eficiência sem sobrecarga em tempo de execução.
# Principais Diferenças Entre [[Pilhas na alocação de memória|Stack]] e [[Heap na alocação de memória|Heap]]
|Parâmetro|Stack|Heap|
|:--|:--|:--|
|**Alocação/Desalocação**|Automática (pelo compilador)|Manual (pelo programador) ou Coletada por Lixo|
|**Velocidade**|Mais Rápida|Mais Lenta|
|**Tamanho**|Fixo, menor (limitado)|Flexível, maior (limitado pela memória do sistema)|
|**Tempo de Vida**|Automático, ligado ao escopo da função|Manual (ou GC), persiste até ser desalocado|
|**Acesso**|Direto, contíguo, amigável ao cache|Indireto (via [[Ponteiros]]), potencialmente fragmentado|
|**Principal Problema**|Stack Overflow|Vazamentos de Memória, Fragmentação, OutOfMemoryError|
|**Segurança**|Thread-safe (dados acessados pela thread proprietária)|Menos thread-safe (dados visíveis para todas as threads)|
|**Flexibilidade**|Tamanho fixo, não flexível|Redimensionamento possível, flexível|
|**Usado Para**|Variáveis locais, chamadas de função|Objetos, grandes estruturas de dados, arrays dinâmicos|
# Exemplo de Alocação de Memória Stack e Heap

**:: Referência ::** [What is Ownership? - The Rust Programming Language](https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html)