1.En la llamada b.init(a) ¿se llama al destructor de la clase A cuando _a sale de su ambito y por consiguiente los punteros c y d están apuntando a basura?.
R. El destructor es llamado solo cuando se destruye el objeto mediante delete, por lo tanto aunque salgas del ambito de la variable, el objeto no es destruido. Para que destruyeras "a" dentro del ambito de la clase B, tendrias que hacer un "delete a" dentro de "b".
2. O como es un puntero lo que se le pasa al método lo que se destruye es el puntero y no a lo que apunta.
R. No estoy muy seguro de haberte entendido bien aca, pero me parece que preguntas casi lo mismo que antes, y no, de nuevo, el puntero no es destruido, lo unico que sucede es que fuera de la clase B, la variable "_a" y "a" que defines dentro de la clase no existen, se consideran como si fueran variables locales a la clase solamente, aunque afuera de b tengas una variable llamada "a" y adentro tambien, al entrar a "b" toma preferencia tu variable local "a", y la variable externa "a" es como si no existiera, ya que queda oculta por la variable "a" que defines dentro de la clase "B". La forma de destruir los punteros es que hicieras delete en alguna parte, de esa forma si tendrias punteros no validos, y al menos en el ejemplo que pones no veo ningun delete en la clase B.
Desconozco que compilador utilizas, pero recomiendo que utilices el depurador (debugger) que venga con tu compilador (casi todos los compiladores modernos cuentan con debugger), ejecuta paso por paso cada linea, metodo por metodo, utiliza puntos de interrupcion, revisa contenido de variables mientras vas depurando, revisa bien tu inicializacion de variables y tambien las sentencias donde haces new and delete, de esa forma es mas probable que encuentres en donde esta el fallo.
Saludos