¿Cómo y cuándo hacer copias de profundidad en c ++

Las clases que asignan los recursos en su constructor normalmente deben incluir un constructor de copia para crear copias de estos recursos. La asignación de un nuevo bloque de memoria y copiar el contenido del original en este nuevo bloque se conoce como la creación de una copia profunda (a diferencia de la copia superficial por defecto). Utilice los siguientes pasos para determinar cómo y cuándo hacer copias profundas en C ++:

  1. Haga siempre una copia en profundidad si el constructor asigna recursos.

    De forma predeterminada, C ++ hace que las llamadas "superficiales" Miembro por miembro de copias de objetos al pasar a funciones o como consecuencia de una cesión. Debe reemplazar los operadores de copia de poca profundidad por defecto con su profundo equivalente copia para cualquier clase que asigna recursos en el constructor. El recurso más común que consigue asignada es la memoria heap que es devuelto por el nuevo operador.

  2. Incluya siempre un destructor de una clase que asigna los recursos.

    Si crea un constructor que asigna recursos, debe crear un destructor que los restaura. Sin excepciones.

  3. Siempre declarar el destructor virtual.

    Un error de principiante común es olvidarse de declarar su destructor virtual. El programa se ejecutará bien hasta que algún programador desprevenido viene y hereda de su clase. El programa todavía parece funcionar, sino porque el destructor de la clase base no podrá ser invocado correctamente, pérdidas de memoria de su programa como un colador hasta que finalmente se estrella. Este problema es difícil de encontrar.

  4. Incluya siempre un constructor de copia para una clase que asigna los recursos.

    El constructor de copia crea una copia correcta del objeto actual mediante la asignación de memoria fuera del montón y copiar el contenido del objeto de origen.

  5. Siempre reemplazar el operador de asignación para una clase que asigna los recursos.

    Los programadores deben ser disuadidos de los operadores predominantes, pero el operador de asignación es una excepción. Usted debe anular el operador de asignación para cualquier clase que asigna recursos en el constructor.

    El operador de asignación debe hacer tres cosas:

  1. Asegúrese de que el objeto de la izquierda y la derecha no son el mismo objeto. En otras palabras, asegúrese de que el programador de aplicaciones no escribió algo así como (a = a). Si lo son, no hacer nada.

  2. Invoque el mismo código que el destructor en el objeto de la izquierda para volver a sus recursos.

  3. Invoque el mismo código que un constructor de copia para hacer una copia en profundidad del objeto de la derecha en el objeto de la mano izquierda.

  • Si usted no puede hacer eso, entonces elimine el constructor de copia y el operador de asignación para que el programa no puede hacer copias de su objeto.

  • Si ni siquiera se puede hacer eso porque el compilador no admite la función de constructor de borrado C ++ 2011, cree un operador constructor de copia y asignación vacía y declararlas protegidas para mantener a otras clases de su uso.




  • » » » » ¿Cómo y cuándo hacer copias de profundidad en c ++