O tipo `String` em [[Rust language|Rust]] foi projetado para lidar com dados de texto mutáveis e redimensionáveis, contrastando com os literais de string imutáveis. Ao contrário dos literais de string, cujo conteúdo é conhecido em tempo de compilação e codificado no executável, `String` gerencia dados alocados na **heap**. Isso permite armazenar texto de tamanho desconhecido em tempo de compilação, como entrada do usuário.
Você pode criar uma `String` a partir de um literal de string usando `String::from()`:
```rust
let s = String::from("hello");
```
Uma diferença fundamental é que `String` pode ser mutada:
```rust
let mut s = String::from("hello");
s.push_str(", world!"); // Appends a literal to the String
println!("{s}"); // Prints `hello, world!`
```
# Memória e Alocação com `String`
Para que `String` suporte texto mutável e redimensionável, ela precisa solicitar memória do **alocador de memória** do sistema em tempo de execução. Essa memória é alocada na **heap**.
O aspecto crucial do tipo `String` de [[Rust language|Rust]] (e outros tipos alocados na heap) é como ele lida com a desalocação de memória. Ao contrário de linguagens com coletores de lixo (GCs) que limpam automaticamente a memória não utilizada, ou linguagens que exigem liberação manual de memória, [[Rust language|Rust]] adota uma abordagem diferente: [[Rust language|Rust]] retorna automaticamente a memória usada por uma `String` ao alocador assim que a variável que a "possui" sai do escopo.
Considere este exemplo:
```rust
{
let s = String::from("hello"); // 's' is valid and its data is on the heap
// You can use 's' here
} // This scope is now over.
// Rust automatically deallocates the memory
// associated with 's' on the heap.
```
Quando uma variável `String` sai do escopo, Rust chama automaticamente uma função especial chamada `drop`. A função `drop` é onde o código para liberar a memória alocada é colocado. Isso garante que a memória seja consistente e automaticamente retornada ao sistema, prevenindo bugs comuns relacionados à memória, como esquecer de liberar memória ou liberá-la várias vezes. Esse padrão é fundamental para o sistema de propriedade de [[Rust language|Rust]] e suas garantias de segurança de memória.