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