Incomprensioni

“Dài ho chiamato delete, ma mica dicevo sul serio!”


int aFunction ()
{
  MyClass * mc = new MyClass();

  // fai qualcosa con mc
  delete mc;
  return mc->anIntField;
}

8 thoughts on “Incomprensioni

  1. Togli pure il probabilmente.
    Il comportamento dipende dal compilatore, c’è chi marca la sezione dello stack libera senza alterarne il contenuto e chi la spiana.
    Questo rende il bug discretamente subdolo, tant’è che il segfault capitava a me, gcc4.0 su OSX e non al mio collega autore del codice, con gcc più recente su piattaforma Linux 32bit. Nel suo caso sebbene l’area di memoria fosse marcata come deallocata, il contenuto c’era lo stesso e riaccedendovi non incorreva in malfunzionamenti.

  2. Sì! Al tuo collega accadeva ciò che è successo anche a me (non so se hai letto il link che ti ho segnalato prima).

    Solo che, da quello che mi hanno detto su StackOverflow, il comportamento non dipende dal compilatore, come credevo anch’io, bensì dalle glibc!
    E in effetti proprio il manuale delle libc ne parla ( http://www.gnu.org/software/libc/manual/html_mono/libc.html#Freeing-after-Malloc ):
    Do not expect to find any data (such as a pointer to the next block in a chain of blocks) in the block after freeing it.

    Del resto essendo il comportamento indefinito, non bisogna proprio aspettarsi nulla. Basta vedere il link che ho riportato per capire che ognuno fa ciò che gli pare😛

  3. C’è qualcosa di musicale nella parola stack che mi ipnotizza… Ovviamente trattandosi di una free() mi riferivo ad una sezione allocata dinamicamente, quindi all’heap. Pardon!

    A parziale discolpa di chi ti (come me) ti ha segnalato un “comportamento dipendente dal compilatore”, che è ovviamente un termine improprio (la deallocazione avviene a runtime, non a compile time), c’è da dire che molto spesso ci si riferisce in maniera colloquiale al “compilatore” in senso ampio, comprendendo compilatore, linker e runtime.

  4. sì, pure io mi riferivo al compilatore come all’attività completa eheh.. però era giusto per precisare, visto che su StackOverflow me l’hanno fatto notare😛

  5. rileggendo il post ho pensato: ma perchè diamine non lo segnalano errore i compilatori?
    del resto segnalano errori per cose molto più complesse, per cui non credo che sarebbe difficile fare una sorta di “parser” per controllare che quell’oggetto sia stato già “liberato”, no?
    c’è qualche opzione avanzata del compilatore che segnala errori del genere?

  6. I compilatori non producono un errore (almeno, se ben ricordo nessuno fra quelli che ho usato) perche` i casi in cui e` identificabile con certezza dalla sola analisi statica del codice sono pochi, banali e tali per cui l’autore del codice non si merita di essere messo in guardia (cosi` la volta successiva sta piu` attento a quel che fa).

Comments are closed.