Ok, I found my error. First cause crashes whille rdwr_vehicles, other with set_besitzer ... But why the switch statement? This is rather longer than a cleanup of the original like below.
gebaeude_t *gb = new gebaeude_t(welt, file);
if(gb->get_tile()->get_besch()->get_extra()==monorail_wt) {
d = new monoraildepot_t(welt, gb->get_pos(), gb->get_besitzer(), gb->get_tile());
}
else if(gb->get_tile()->get_besch()->get_extra()==tram_wt) {
d = new tramdepot_t(welt, gb->get_pos(), gb->get_besitzer(), gb->get_tile());
}
else {
d = new bahndepot_t(welt, gb->get_pos(), gb->get_besitzer(), gb->get_tile());
}
((bahndepot_t *)d)->rdwr_vehicles( file );
typ = d->get_typ();
// do not remove from this position, since there will be nothing
gb->set_flag(ding_t::not_on_map);
delete gb;