Looking for c++ Answers? Try Ask4KnowledgeBase
Looking for c++ Keywords? Try Ask4Keywords

C++RAII: la adquisición de recursos es la inicialización


Observaciones

RAII significa R isource A cquisition I s I nitialization. RAII es una expresión idiomática utilizada para vincular los recursos con la vida útil de los objetos. También se conoce como SBRM (Administración de recursos basada en el alcance) o RRID (La publicación del recurso es destrucción). En C ++, el destructor para un objeto siempre se ejecuta cuando un objeto se sale del alcance, podemos aprovechar eso para vincular la limpieza de recursos con la destrucción de objetos.

Cada vez que necesite adquirir algún recurso (por ejemplo, un bloqueo, un identificador de archivo, un búfer asignado) que eventualmente necesitará liberar, debe considerar usar un objeto para manejar esa administración de recursos por usted. El desenrollado de la pila ocurrirá independientemente de la excepción o la salida temprana del alcance, por lo que el objeto del controlador de recursos limpiará el recurso por usted sin que tenga que considerar cuidadosamente todas las rutas de código actuales y futuras posibles.

Vale la pena señalar que RAII no libera completamente al desarrollador de pensar en la vida útil de los recursos. Un caso es, obviamente, una llamada crash o exit (), que evitará que se llame a los destructores. Como el sistema operativo limpiará los recursos locales del proceso, como la memoria, después de que finalice el proceso, esto no es un problema en la mayoría de los casos. Sin embargo, con los recursos del sistema (es decir, canalizaciones con nombre, archivos de bloqueo, memoria compartida), todavía se necesitan recursos para tratar el caso en el que un proceso no se limpió después de sí mismo, es decir, en la prueba de inicio si el archivo de bloqueo está ahí, si es así, Verifique que el proceso con el pid realmente existe, luego actúe en consecuencia.

Otra situación es cuando un proceso de Unix llama a una función de la familia exec, es decir, después de un fork-exec para crear un nuevo proceso. Aquí, el proceso hijo tendrá una copia completa de la memoria de los padres (incluidos los objetos RAII), pero una vez que se llamó a exec, no se llamará a ninguno de los destructores en ese proceso. Por otro lado, si un proceso se bifurca y ninguno de los procesos llama exec, todos los recursos se limpian en ambos procesos. Esto es correcto solo para todos los recursos que realmente se duplicaron en la bifurcación, pero con los recursos del sistema, ambos procesos solo tendrán una referencia al recurso (es decir, la ruta de acceso a un archivo de bloqueo) y ambos intentarán liberarlo individualmente, lo que podría causar El otro proceso para fallar.

RAII: la adquisición de recursos es la inicialización Ejemplos relacionados