¿Te refieres a tener que liberar memoria manualmente, cerrar archivos, cosas de este tipo? Si es así, diría que el mínimo y típicamente menos que la mayoría de los otros idiomas que he usado, especialmente si generalizamos eso no solo a la "administración de memoria" sino a la "administración de recursos". En ese sentido, creo que C ++ requiere menos administración de recursos manual que, por ejemplo, Java o C #.
Se debe principalmente a los destructores que automatizan la destrucción del recurso (memoria o no). Por lo general, el único momento en que tengo que liberar / destruir un recurso manualmente en C ++ es si estoy implementando una estructura de datos a nivel de vlow (algo que la mayoría de la gente no necesita hacer) o usando una API de C donde solo paso un poco de tiempo envolviendo el recurso C que necesita ser liberado / destruido / cerrado manualmente en un contenedor C ++ compatible con RAII.
Por supuesto, si un usuario solicita cerrar una imagen en un software de edición de imágenes, tengo que eliminar la imagen de una colección o algo así. Pero, con suerte, eso no cuenta como gestión de "memoria" o "recurso" de un tipo que importa en este contexto, ya que eso es bastante necesario en cualquier idioma si desea liberar la memoria asociada con esa imagen en ese momento. Pero de nuevo, todo lo que tiene que hacer es eliminar la imagen de la colección y el destructor de imágenes se encargará del resto.
Mientras tanto, si me comparo con, por ejemplo, Java o C #, a menudo encuentras personas que tienen que cerrar archivos manualmente allí, desconectar manualmente los sockets, establecer referencias de objeto en nulo para permitir que se recojan basura, etc. Hay mucha más memoria manual y gestión de recursos en esos idiomas si me preguntas. En C ++, a menudo ni siquiera necesita unlock
un mutex manualmente, ya que el casillero mutex lo hará automáticamente cuando el mutex salga del alcance. Por ejemplo, nunca debería tener que hacer cosas como esta 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();
}
No hay necesidad de hacer cosas como cerrar archivos manualmente en C ++. Terminan cerrándose automáticamente en el instante en que salen del alcance, ya sea que se salgan del alcance como resultado o como rutas de ejecución normales o excepcionales. Algo similar para recursos relacionados con la memoria como std::vector
. Tal código como el file.Close()
anterior a menudo estaría mal visto, ya que, especialmente en el contexto de un finally
bloque, sugiere que el recurso local debe liberarse manualmente cuando toda la mentalidad en torno a C ++ es automatizar eso.
En términos de gestión de memoria manual, diría que C requiere el máximo, Java / C # una cantidad media y C ++ el mínimo entre estos. Hay muchas razones para ser un poco tímido al usar C ++ ya que es un lenguaje muy difícil de dominar, pero la administración de memoria no debería ser una de ellas. Por el contrario, creo que es uno de los idiomas más fáciles que existen en este aspecto.
Por supuesto, C ++ le permite comenzar a asignar memoria manualmente e invocar operator delete/delete[]
para liberar memoria manualmente. También le permite usar funciones C como malloc
yfree
. Pero esas son prácticas de codificación de estilo antiguo que creo que se volvieron obsoletas mucho antes de que las personas den crédito, ya que Stroustrup defendía la RAII incluso antes de que acuñara el término desde el principio. Así que ni siquiera creo que sea justo decir que "C ++ moderno" automatiza la gestión de recursos, porque se suponía que ese era el propósito todo el tiempo. Prácticamente no puede obtener seguridad de excepción de lo contrario. Es solo que muchos desarrolladores equivocados a principios de los 90 intentaron usar C ++ como C con objetos, a menudo ignorando por completo el manejo de excepciones, y nunca se suponía que se usara de esa manera. Si usa C ++ de la forma en que prácticamente siempre se pretendía usar, entonces la administración de memoria está totalmente automatizada y, en general, no es algo con lo que tenga que lidiar manualmente (o debería lidiar) en absoluto.