Avatar ·

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.