¿Qué es la "Regla de los Tres" en C++ y por qué sin ella hay una fuga de memoria?
¡Hola a todos! Empecé a estudiar C++ y me encontré con un problema. Escribo una clase simple que almacena una cadena mediante memoria dinámica. Parece todo lógico, pero el programa se cuelga o se comporta de manera extraña.
Aquí está mi 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; // Copia
String s3("World");
s3 = s1; // Asignación
return 0;
}
```
Después de ejecutar, el programa falla con un error double free. Entiendo que el problema es que al copiar, ambos objetos apuntan a la misma memoria, y luego ambos intentan eliminarla. Pero, ¿cómo se corrige esto correctamente? ¿Qué es la "Regla de los Tres" que todos mencionan? ¿Y por qué dicen que en C++11 apareció la "Regla de los Cinco"? Agradecería una explicación detallada.