Vous voulez dire, par exemple, devoir libérer manuellement de la mémoire, fermer des fichiers, etc.? Si tel est le cas, je dirais le minimum et généralement moins que la plupart des autres langues que j'ai utilisées, en particulier si nous généralisons cela non seulement à la "gestion de la mémoire" mais également à la "gestion des ressources". En ce sens, je pense réellement que le C ++ nécessite moins de gestion manuelle des ressources que, disons, Java ou C #.
Cela est principalement dû aux destructeurs qui automatisent la destruction de la ressource (mémoire ou autre). Généralement, le seul moment où je dois libérer / détruire manuellement une ressource en C ++ est si j'implémente une structure de données au niveau vlow (ce que la plupart des gens n'ont pas besoin de faire) ou à l'aide d'une API C où je passe juste un peu de temps encapsulant la ressource C devant être libérée / détruite / fermée manuellement dans un wrapper C ++ conforme à RAII.
Bien sûr, si un utilisateur demande à fermer une image dans un logiciel de retouche d'image, je dois supprimer l'image d'une collection ou quelque chose du genre. Mais espérons que cela ne compte pas comme gestion de "mémoire" ou de "ressources" d'un type qui importe dans ce contexte, car requis dans toutes les langues si vous souhaitez libérer la mémoire associée à cette image à ce moment-là. Mais encore une fois, tout ce que vous avez à faire est de supprimer l’image de la collection et le destructeur d’image s’occupe du reste.
Entre-temps, si je compare à, par exemple, Java ou C #, les utilisateurs sont souvent obligés de fermer des fichiers manuellement, de déconnecter manuellement des sockets, de définir des références d'objet sur null afin de permettre leur ramassage illégal, etc. gestion des ressources dans ces langues si vous me demandez. En C ++, vous n'avez souvent même pas besoin d' unlock
un mutex manuellement, car le casier à mutex le fait automatiquement pour vous lorsque le mutex sort de son périmètre. Par exemple, vous ne devriez jamais avoir à faire des choses comme celle-ci en 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();
}
Il n'est pas nécessaire de faire des choses comme fermer des fichiers manuellement en C ++. Ils se ferment automatiquement dès l'instant où ils sortent de la portée, qu'ils le soient par la suite ou par des chemins d'exécution normaux ou exceptionnels. Une chose similaire pour les ressources liées à la mémoire comme std::vector
. Un tel code, comme file.Close()
ci-dessus, serait souvent mal vu car, en particulier dans le contexte d'un finally
bloc, cela suggère que la ressource locale doit être libérée manuellement, alors que tout l'état d'esprit autour de C ++ est de l'automatiser.
En termes de gestion manuelle de la mémoire, je dirais que le C nécessite le maximum, Java / C # un montant moyen et le C ++ le minimum. Il y a beaucoup de raisons d'être un peu timide en utilisant C ++ car c'est un langage très difficile à maîtriser, mais la gestion de la mémoire ne devrait pas en faire partie. Au contraire, je pense en fait que c'est l'un des langages les plus faciles à utiliser dans cet aspect.
Bien sûr, C ++ vous permet de commencer à allouer manuellement de la mémoire et à appeler operator delete/delete[]
pour libérer manuellement de la mémoire. Il vous permet également d’utiliser des fonctions C comme malloc
etfree
. Mais ce sont des pratiques de codage à l’ancienne qui, à mon avis, sont devenues obsolètes bien avant que les gens n’en donnent le crédit, puisque Stroustrup prônait RAII avant même d’avoir utilisé ce terme très tôt. Donc, je ne pense même pas qu'il soit juste de dire que "le C ++ moderne" automatise la gestion des ressources, car c'était censé être le but recherché depuis le début. Vous ne pouvez pratiquement pas obtenir une sécurité d'exception autrement. Au début des années 90, de nombreux développeurs malavisés ont essayé d'utiliser le C ++ comme un C avec des objets, ignorant souvent complètement la gestion des exceptions, et il n'a jamais été supposé être utilisé de cette façon. Si vous utilisez le C ++ de la manière dont il était pratiquement destiné à être utilisé, la gestion de la mémoire est totalement automatisée et ne nécessite généralement pas une gestion manuelle (ou devrait être traitée) du tout.