Primero voy a hacer algunos comentarios morales:
Estás aprendiendo C++, entonces:
0) necesitas un buen libro.
1) no uses new (y no uses delete). Son mecanismos para situaciones excepcionales. En la vida real, cuando un experto los usa, debe dar explicaciones, convincentes.
2) no uses system(), menos en algo como system("cls"); Si estás intentando aprender el lenguaje, ¿cómo es que ya has aprendido los vicios de un mal programador de hace 30 años?
3) no uses std::endl; no lo necesitas. Quizá, si en algún momento te encuentras en las fronteras de alguna sofisticada arquitectura concurrente, bueno, en ese momento supongo que ya sabrás. Mientras tanto sólo molesta.
4) no uses strcpy(), estás llamando a la desgracia. Pero de todos modos, así como en C++ no se usan punteros tampoco se usan arrays, así que obviamente strcpy no tiene ninguna razón de ser.
Y un comentario técnico:
Tu programa tiene dos errores:
1) La función de comparación (tu operator<()) no tiene en cuenta cuando las dos cadenas son iguales. Puedes probar con:
bool operator<(const Usuario& _thisUser, const Usuario& _otherUser) {
return strcmp(_thisUser.nombre, _otherUser.nombre) < 0;
}
2) estás usando delete dos veces sobre el mismo puntero.
En esta porción del
Usuario usuario; ///< creas un Usuario
// etcetera,,,
usuarios.insert(usuario); ///< insertas una copia de tu Usuario en el set.
El problema es que usuarios.insert() inserta una copia, y como no has definido qué es hacer una copia de un Usuario, el compilador ha sintetizado tanto el "copy constructor" como el "copy assignment operator", y en ese caso hace una "shallow copy" del puntero nombre.
Luego se está invocando delete[] dos veces sobre cada uno de los punteros. La primera vez cuando la variable local usuario sale de ámbito y la segunda vez cuando el set usuarios sale de ámbito (se invoca el destructor de sus elementos).
Puedes reemplazar tu destructor por este otro para ver que se está invocando dos veces delete[] para cada nombre:
Usuario::~Usuario() {
std::cout << "delete[] " << nombre << '\n';
//delete[] nombre;
}
Lectura:
https://en.cppreference.com/w/cpp/language/rule_of_three The rule of three/five/zero