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.