Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Cancellare fisicamente una struttura dati

    Ho cercato su google ma non sono riuscito a darmi una risposta soddisfacente...


    Mi chiedono di cancellare una struttura dati. Come mi devono comportare?

    Esempio. Ho uno Stack.

    codice:
    Stack pippo = new Stack();
    pippo.push(1); pippo.push(2); // pippo.push... (e così via)
    Voglio ora che il garbage collector faccia pulizia. Mi è sufficiente fare

    codice:
    pippo = null; // ?
    Ci pensa il gc a deallocare tutto lo spazio dell'array usato per implementare lo Stack?

    O devo passarmi tutti gli elementi dello Stack e metterli a null? Quest'ultima soluzione mi sembra assolutamente pessima dal punto di vista delle prestazioni (supponete che la struttura dati sia più complessa...)

  2. #2
    Non devi fare niente, il GC non guarda cosa contiene un oggetto per decidere se và eliminato, conta i riferimenti, quando non ci sono più riferimenti nel tuo codice quell'oggetto viene marcato e fatto fuori al prossimo giro di pulizie, settarlo a null non serve a nulla.

  3. #3
    Piano, con calma.

    Moltissime fonti, tra cui il sorgente di moltissime classi di java.util impostano a null i riferimenti in modo che, come dici tu, non ci sono più riferimenti a determinati oggetti.

    Il problema è che

    Stack pippo;

    è un riferimento all'oggetto di tipo "Stack" e non all'array che lo contiene. Distruggendo l'oggetto a cui pippo faceva riferimento, distruggo anche l'array creato dall'oggetto?

  4. #4
    Gli elementi dell'array di cui non hai riferimenti nel tuo codice, sono referenziati solo dallo Stack, tolto lo Stack diventano orfani a loro volta ed eligibili per il GC.

    L'unico esclusivo caso in cui serve nullare dei riferimenti è se stai implementando tu stesso una collezione in cui tieni più elementi di quanti è logicamente possibile accedere all'esterno della tua classe.
    Esempio, immagina vuoi fare una classe Film che contiene una array di Scene, a cui si accede con prossimaScena() ma non vuoi dare la possibilità di riavvolgere, mano a mano che l'utilizzatore scorre le scene quelle vecchie restano valide ma inutili ed ha senso nullarle a mano.
    Il 99% delle volte nullando oggetti per "aiutare" la GC è inutile o addirittura dannoso.

    Se vuoi approfondire
    http://www.ibm.com/developerworks/li...-jtp01274.html

  5. #5
    Sì prima di postare nel forum avevo proprio consultato quel link, trovato su google.

    Lì dice che è buona norma porre a null gli elementi che non si usano più, ma di certo è una pessima idea fare un ciclo per cancellare tutti gli elementi di un array o di altre DS.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.