Il problema è che ogni volta che tu aggiungi un elemento al vector acciaio, questo può esaurire la sua capacità interna e decidere di riallocare il blocco di memoria che gestisce, rendendo non più validi tutti i puntatori ai suoi elementi. La soluzione più semplice è evitare questi giri strani con i vettori e semplicemente usare dentro Nodo uno smart pointer che gestisca l'oggetto di tipo Materiale. Se non ti serve condividere i medesimi materiali tra più nodi, in C++ pre-11 puoi usare std::auto_ptr (avendo cura di disabilitare il costruttore di copia di Nodo), con l'ultima versione dello standard (o usando Boost) puoi usare unique_ptr/scoped_ptr.