O que é a "Regra dos Três" em C++ e por que sem ela há vazamento de memória?
Olá a todos! Comecei a estudar C++ e me deparei com um problema. Estou escrevendo uma classe simples que armazena uma string usando memória dinâmica. Parece tudo lógico, mas o programa trava ou se comporta de forma estranha.
Aqui está meu código:
```cpp
class String {
public:
String(const char* str = "") {
size = strlen(str);
data = new char[size + 1];
strcpy(data, str);
}
~String() {
delete[] data;
}
private:
char* data;
int size;
};
int main() {
String s1("Hello");
String s2 = s1; // Cópia
String s3("World");
s3 = s1; // Atribuição
return 0;
}
```
Após a execução, o programa trava com um erro double free. Eu entendo que o problema é que, ao copiar, ambos os objetos apontam para a mesma memória e depois ambos tentam deletá-la. Mas como corrigir isso corretamente? O que é a "Regra dos Três", que todos mencionam? E por que dizem que em C++11 surgiu a "Regra dos Cinco"? Ficarei grato por uma explicação detalhada.