29 ottobre 2007

Gestione della copia

Lezione di lunedì 29 ottobre, 1 ora
[>50 presenti]

Argomenti:

  • interferenza
  • passaggio per riferimento nel costruttore di copia
  • copia profonda
  • distruttore
  • operatore di assegnazione
Podcast:
registrazione audio di questa lezione, in formato wav

Dispense:
Gestione della memoria: costruttore di copia, operatore di assegnazione, distruttore, interferenza


Vedi anche:

5 commenti:

Anonimo ha detto...

non mi è molto chiaro l'uso della funzione f...
cioè ho capito cosa fa, ma nn ho capito perkè l'abbiamo messa...

Emanuele Panizzi ha detto...

Ho usato quella funzione per mostrare il problema dell'interferenza.
Il costruttore di copia di default viene chiamato per copiare il parametro attuale nel parametro formale Lis della funzione f(). Tale costruttore di copia, copia i campi dell'oggetto, non curandosi del fatto che il campo testa sia un puntatore e che quindi a quell'oggetto appartiene anche una parte di memoria dinamica. Si avranno perciò due puntatori da due oggetti lista alla stessa "lista" in memoria dinamica. Questo si chiama "condivisione di memoria". Ecco che, modificando la lista di uno dei due oggetti (facendo "side-effect" sull'oggetto), si produce involontariamente una modifica anche all'altro oggetto. Inoltre, questa modifica può "rompere" l'altro oggetto, ad esempio quando l'elemento puntato dal puntatore testa è stato rilasciato.
La funzione f() ci ha quindi permesso di evidenziare il problema dell'interferenza, dovuto alla somma della condivisione di memoria e del side-effect.
Questo problema può essere risolto in due modi: eliminando la condivisione (ridefinendo costruttore di copia, operatore di assegnazione e distruttore) oppure eliminando il side-effect (non l'abbiamo trattato a lezione), cioè facendo in modo che tutti i metodi della classe non modifichino mai l'oggetto di invocazione, ma questo secondo metodo è poco object-oriented.

Anonimo ha detto...

scusi prof ma
lista::lista()
{ head = NULL; }
mio compilatore dice k
'NULL' was not declared in this scope.....
cosa devo fare?

Anonimo ha detto...

scusi prof ma
lista::lista()
{ head = NULL; }
mio compilatore dice k
'NULL' was not declared in this scope.....
cosa devo fare?

Emanuele Panizzi ha detto...

Includa iostream e "using namespace std;"