E quindi? Niente ti impedisce di usare le funzioni set per fare controlli ulteriori se ne hai bisogno. Funzioni che tra l'altro non usi mai (vedi costruttori vari e operatori di assegnamento)
Quello che ti sto facendo notare è che hai già delle variabili membro della dimensione giusta, per cui puoi tranquillamente fare così:
codice:
void pacco::read_bin(const char* filebin) throw(err){
ifstream in;
in.open(filebin, ios::in | ios::binary);
if(in.fail()) throw err("errore nell'apertura del file", "posta::pacco::read_bin()");
int len;
char* ind;
in.read((char*)&codice,sizeof(cod));
in.read((char*)&peso,sizeof(pes));
in.read((char*)&len,sizeof(len));
indirizzo = new char [len+1];
in.read(ind,len);
ind[len]='\0';
set_cod(codice); // eventuale controllo
set_pes(peso); // eventuale controllo
set_ind(ind); // memory leaks qui
in.close();
}
osserva la funzione pacco::set_ind() e dimmi quando deallochi la memoria assegnata a ind. E dimmi la funzione che eventualmente ne deve gestire il lifetime.
Ultima cosa: il distruttore dov'è? Quando pacco esce dallo scope, chi libera la memoria assegnata a indirizzo?
E in pila? Se dovessero rimanere dei nodi allocati in pila, chi ne libera la memoria quando un oggetto pila esce dallo scope?
Immagina siano queste le domande poste da chi ti ha assegnato la traccia e che valgono per ogni classe dove allochi memoria.
In C++ la gestione della memoria è un aspetto critico ed è la prima cosa che deve saltare all'occhio.