Como e quando fazer cópias de profundidade em C ++

Classes que alocam recursos em seu construtor deve normalmente incluem um construtor de cópia para criar cópias desses recursos. A inscrição de um novo bloco de memória e copiar o conteúdo do original para este novo bloco é conhecida como a criação de um cópia profunda (Em oposição à cópia superficial padrão). Use as seguintes etapas para determinar como e quando fazer cópias de profundidade em C ++:

  1. Sempre faça uma cópia em profundidade se o construtor aloca recursos.

    Por padrão, C ++ torna os chamados "rasas" membro-a-membro cópias de objetos quando passá-los para funções ou como o resultado de uma atribuição. Você deve substituir os operadores cópia superficial padrão com seu equivalente cópia em profundidade para qualquer classe que aloca recursos no construtor. O recurso mais comum que é alocada é a memória heap que é devolvido pelo novo operador.

  2. Sempre inclua um destrutor para uma classe que aloca recursos.

    Se você criar um construtor que aloca recursos, é necessário criar um processo de destruição que os restaura. Sem exceções.

  3. Sempre declare o destruidor virtual.

    Um erro de principiante comum é esquecer de declarar seu destrutor virtual. O programa será executado muito bem até que algum programador desavisado vem e herda de sua classe. O programa ainda parece funcionar, mas porque o destruidor na classe base não pode ser invocado corretamente, vazamentos de memória de seu programa como uma peneira até que finalmente cai. Este problema é difícil de encontrar.

  4. Sempre inclua um construtor de cópia para uma classe que aloca recursos.

    O construtor de cópia cria uma cópia apropriada do objeto atual de alocação de memória fora do heap e copiar o conteúdo do objeto de origem.

  5. Sempre substituir o operador de atribuição para uma classe que aloca recursos.

    Os programadores devem ser desencorajados de operadores de maior relevo, mas o operador de atribuição é uma exceção. Você deve substituir o operador de atribuição para qualquer classe que aloca recursos no construtor.

    O operador de atribuição deve fazer três coisas:

  1. Certifique-se de que o objeto da mão esquerda e direita não são o mesmo objeto. Em outras palavras, certifique-se de que o programador da aplicação não escrever algo como (a = a). Se forem, não fazer nada.

  2. Invocar o mesmo código que o destruidor sobre o objeto da mão esquerda para voltar seus recursos.

  3. Invocar o mesmo código como um construtor de cópia para fazer uma cópia profunda do objeto mão direita para o objeto da mão esquerda.

  • Se você não pode fazer isso, então excluir o construtor de cópia e operador de atribuição para que o programa não pode fazer cópias de seu objeto.

  • Se você não pode mesmo fazer isso porque seu compilador não suporta o recurso de construtor de exclusão C ++ 2011, criar uma cópia construtor e atribuição operador vazio e declará-los protegido para manter outras classes de usá-los.

  • menu