Si no me equivoco el error que obtienes es al hacer un double "delete" sobre la misma memoria dinamica. Primero tu sobrecarga del operador de asignacion no deberia trabajar con copias de los objectos sino con referencias:
void datos::operator=(datos rDatos){}
deberia ser
void datos::operator=(const datos &rDatos){}
Tambien te aconsejaria que para poder usar asignaciones en cadena modifiques tu funcion a
datos &datos::operator=(const datos &rDatos)
{
// ...
return *this;
}
Luego, mi teoria de tu error es que al enviar tu estructura como parametro a la funcion lo estas haciendo por valor (por defecto), lo que crea una copia de los valores de dicha estructura en memoria al pasar a dicha funcion, cuando el tiempo de vida del parametro termina al salir de la funcion, se invoca a tu destructor sobre el mismo puntero de tu estructura original (ambos punteros apuntan a la misma memoria), luego al terminar tu funcion principal y concluir el ambito de tu variable de estructura original, se volvera a destruir el objeto llamando a tu destructor el cual intentara realizar otro "delete" sobre la misma posicion de memoria ya liberada antes, provocando una excepcion.
Posibles soluciones
Solucion 1: Intenta pasar tu estructura a la funcion por referencia y cuenta que tal:
miFuncion(miVariable);
void miFuncion(const datos &miVariable)
{
datos miOtraVariable;
miOtraVariable = miVariable;
}
Solucion 2: Create un constructor de copia para tu estructura
datos::datos(const datos ©)
{
// tu copia aqui
}
Saludos