C ++: el concepto de copia superficial y copia profunda

En primer lugar, ¿veremos si hay un problema con la implementación de la siguiente clase de cadena?

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);
}

Inserte la descripción de la imagen aquí

La clase String anterior no define explícitamente su sobrecarga del constructor de copia y del operador de asignación. En este momento, el compilador sintetizará el valor predeterminado. Cuando se usa s1 para construir s2, el compilador llamará a la construcción de copia predeterminada. El problema ocasionado es que s1 y s2 comparten el mismo espacio de memoria, y el mismo bloque de espacio se libera varias veces durante el lanzamiento, lo que hace que el programa se bloquee . Este método de copia se denomina copia superficial.

Copia superficial

Copia superficial: también llamada copia en bits, el compilador simplemente copia el valor en el objeto. Si los recursos se administran en un objeto, varios objetos finalmente compartirán el mismo recurso. Cuando se destruye un objeto, se liberará el recurso. En este momento, otros objetos no saben que el recurso se ha liberado y piensan que todavía es válido, por lo que Cuando continúe operando con recursos, se producirá una infracción de acceso . Para resolver el problema de la copia superficial, se introdujo la copia profunda en C ++.

Copia profunda

Si la gestión de recursos está involucrada en una clase, su constructor de copia, la sobrecarga del operador de asignación y el destructor deben darse explícitamente. En general, se proporciona en forma de copia profunda.

Inserte la descripción de la imagen aquí

152 artículos originales publicados · 45 elogiados · 10,000+ vistas

Supongo que te gusta

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