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 ++:
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.
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.
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.
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.
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:
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.
Invocar o mesmo código que o destruidor sobre o objeto da mão esquerda para voltar seus recursos.
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.