C ++: O conceito de cópia superficial e cópia profunda

Primeiro de tudo, vamos ver se há algum problema com a implementação da seguinte classe de string?

class String
{
	char* _str;
public:
    String(const char* str = "")
    {
		// 构造string类对象时,如果传递nullptr指针,认为程序非法,此处断言下 
		if(nullptr == str)
		{
            assert(false);
			return; 
		}
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);
    }
	~String() {
		if(_str) {
        	delete[] _str;
			_str = nullptr;
    	}
	}
};

// 测试
void TestString() {
    String s1("hello bit!!!");
    String s2(s1);
}

Insira a descrição da imagem aqui

A classe String acima não define explicitamente a sobrecarga do construtor de cópias e do operador de atribuição.Neste momento, o compilador sintetizará o padrão.Quando s1 for usado para construir s2, o compilador chamará a construção de cópia padrão. O problema eventualmente causado é que s1 e s2 compartilham o mesmo espaço de memória e o mesmo bloco de espaço é liberado várias vezes durante o lançamento, causando uma falha no programa.Este método de cópia é chamado de cópia superficial.

Cópia rasa

Cópia rasa: Também chamada de cópia em bits, o compilador apenas copia o valor no objeto. Se os recursos forem gerenciados em um objeto, vários objetos acabarão compartilhando o mesmo recurso. Quando um objeto é destruído, o recurso será liberado. No momento, outros objetos não sabem que o recurso foi liberado e pensam que ainda é válido, portanto Quando você continuar operando com recursos, ocorrerá uma violação de acesso . Para resolver o problema de cópia superficial, a cópia profunda foi introduzida em C ++.

Cópia profunda

Se o gerenciamento de recursos estiver envolvido em uma classe, seu construtor de cópias, sobrecarga do operador de atribuição e destruidor deverão ser fornecidos explicitamente. Geralmente, é fornecido na forma de cópia profunda.

Insira a descrição da imagem aqui

Publicado 152 artigos originais · elogiou 45 · 10.000+ visualizações

Acho que você gosta

Origin blog.csdn.net/AngelDg/article/details/105060174
Recomendado
Clasificación