Você quer dizer manualmente ter que liberar memória, fechar arquivos, coisas desse tipo? Nesse caso, eu diria o mínimo e normalmente menos do que a maioria dos outros idiomas que usei, especialmente se generalizarmos isso não apenas para "gerenciamento de memória", mas "gerenciamento de recursos". Nesse sentido, acho que o C ++ requer menos gerenciamento manual de recursos do que, digamos, Java ou C #.
É principalmente devido a destruidores que automatizam a destruição do recurso (memória ou não). Normalmente, a única vez que tenho que liberar / destruir um recurso manualmente em C ++ é se estou implementando uma estrutura de dados no nível vlow (algo que a maioria das pessoas não precisa fazer) ou usando uma API C, onde passo apenas um pouco de tempo agrupando o recurso C que precisa ser liberado / destruído / fechado manualmente em um wrapper C ++ em conformidade com RAII.
É claro que se um usuário solicitar o fechamento de uma imagem em um software de edição de imagens, eu tenho que remover a imagem de uma coleção ou algo assim. Mas espero que isso não conte como gerenciamento de "memória" ou "recurso" de um tipo que importa nesse contexto, pois isso é praticamente necessário em qualquer idioma, se você quiser liberar a memória associada a essa imagem naquele momento. Mas, novamente, tudo o que você precisa fazer é remover a imagem da coleção e o destruidor de imagens cuidará do resto.
Enquanto isso, se eu comparar, digamos, Java ou C #, você geralmente encontrará pessoas que precisam fechar arquivos manualmente, desconectar soquetes manualmente, definir referências de objetos como nulas para permitir que sejam coletadas como lixo, etc. Há muito mais memória manual e gerenciamento de recursos nesses idiomas, se você me perguntar. No C ++, muitas vezes você nem precisa de unlock
um mutex manualmente, pois o armário do mutex fará isso automaticamente quando o mutex estiver fora do escopo. Por exemplo, você nunca deve fazer coisas como esta em C ++:
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
Não é necessário fazer coisas como fechar arquivos manualmente em C ++. Eles acabam se fechando automaticamente no instante em que ficam fora do escopo, como resultado ou em caminhos de execução normais ou excepcionais. Coisa semelhante para recursos relacionados à memória, como std::vector
. Esse código, como file.Close()
acima, muitas vezes seria desaprovado, pois, especialmente no contexto de um finally
bloco, que sugere que o recurso local precisa ser liberado manualmente quando toda a mentalidade em torno do C ++ é automatizá-lo.
Em termos de gerenciamento manual de memória, eu diria que C requer o máximo, Java / C # uma quantidade média e C ++ o mínimo entre esses. Há muitas razões para ser um pouco tímido em usar C ++, pois é uma linguagem muito difícil de dominar, mas o gerenciamento de memória não deve ser um deles. Pelo contrário, acho que é uma das línguas mais fáceis por aí neste aspecto.
É claro que o C ++ permite que você comece a alocar manualmente a memória e a invocar operator delete/delete[]
para liberar memória manualmente. Também permite usar funções C como malloc
efree
. Mas essas são práticas de codificação no estilo antigo que eu acho que se tornaram obsoletas muito antes das pessoas darem crédito, já que Stroustrup estava defendendo a RAII antes mesmo de cunhar o termo desde muito cedo. Portanto, nem acho justo dizer que "C ++ moderno" automatiza o gerenciamento de recursos, porque esse deveria ser o objetivo o tempo todo. Praticamente não é possível obter segurança de exceção. Só que muitos desenvolvedores mal orientados durante o início dos anos 90 tentaram usar C ++ como C com objetos, geralmente ignorando completamente o tratamento de exceções, e nunca era para ser usado dessa maneira. Se você usa C ++ da maneira que ele sempre pretendia ser usado, o gerenciamento de memória é totalmente automatizado e, geralmente, não é algo com o qual você tenha que lidar manualmente (ou deveria estar lidando com) muito.