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

    deallocazione

    scusate ma ho ancora qualche dubbio sulla deallocazione...
    in questa fuzione per l'estrazione di un nodo da una lista viene prima deallocato p e poi continua ad essere utilizzato...
    come fa se è stato deallocato?

    codice:
    void EstrazioneC(void)
    {
      if (ListaVuota() == true)
        {
           p = tdl;        // p puntatore di comodo per scorrere la lista
                           // è il puntatore del nodo attuale
           pprec = NULL;  // puntatore del nodo precedente a quello
                          // attuale puntato dal puntatore p
           
         // il ciclo serve per scorrere l'intera lista ed arrivare all'ultimo nodo
         // conservando il puntatore del nodo precedente, in cui si deve 
         // inserire la costante NULL nella sua parte puntatore
           while (p->psucc != NULL)
               { 
                 pprec = p;       // si salva il puntatore corrente
                 p = p->psucc;    // per scorrere la lista
               }            
           
           cout << " Nodo estratto --->  " << p->inf<<endl;
           delete p;
           // se la lista è costituita da un solo nodo si elimina l'intera lista
           if (p == tdl)
               {tdl = NULL;}
           else
               {pprec->psucc = NULL;}
           
        }
      return;  
    }

  2. #2
    dunque ... il fatto è che viene deallocata (liberata) la parte di memoria puntata da p e non p come puntatore.

    esempio:

    p->[dati] p punta ad un area di memoria

    delete p;

    p->XXX p punta alla stessa area di memoria ma che adesso è "segnata" come libera.

    è possibile usare ancora p per "puntare" ma se cerco di leggere o scrivere l'area di memoria puntata
    da p avro un null pointer error (o come cavolo si chiama :-) )

    ciao!!!
    www.valarsoft.com (Free GNU/GPL softwares and games)

  3. #3
    Si lo sapevo, ma non avevo capito il senso in questo codice,

    praticamente se il nodo fosse unico il ciclo while non verrebe eseguito e la tdl (testa della lista) rimarrebbe uguale a p, ponendo tdl =NULL elimino tutti i puntatori, ma non ho deallocato la memoria...
    qualcosa non mi suona bene!!

  4. #4
    dunque:

    i puntatori che puntano a null non vanno deallocati semplicemente puntano a niente e niente è già deallocato :-) )

    con tdl=null azzeri la lista, ma la azzeri solo se togli l'ultimo elemento rimasto....cioè
    la funzione ogni volta che viene chiamata dealloca l'ultimo elemento in lista ... quindi ad esempio per azzerare una lista con tre elementi dovresti chiamare EstrazioneC() tre volte, ma ogni volta che richiami EstrazioneC() si dealloca esattamente un solo elemento, in sintesi per come è fatta la funzione
    la memoria si dealloca correttamente e non restano puntatori "spaiati" :-)

    non so se sono stato chiaro :-)
    www.valarsoft.com (Free GNU/GPL softwares and games)

  5. #5
    Ma se omettevo di deallocare p, nella lista l'ultimo nodo lo avevo estratto lo stesso, semplicemente continuavo ad occupare la memoria dell'ultimo nodo, no?
    E quando dichiaro tdl=NULL non mi resta occupata lo stesso la memoria?

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Onestamente a me puzza di undefined beaviour quel pezzo di codice. Un puntatore non più valido non dovrebbe essere mai usato se non per appiccicarci un altro pezzo di memoria.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    e' vero, il codice giusto dovrebbe avere quest'ordine:

    codice:
      
           // se la lista è costituita da un solo nodo si elimina l'intera lista
           if (p == tdl)
               {tdl = NULL;}
           else
               {pprec->psucc = NULL;}
         delete p;
    cioè prima controllare "p" e poi deallocare, ma poichè (correggetemi se sbaglio) la locazione puntata dalla
    testa (da tdl) non cambia all'interno della funzione, la condizione if(p==tdl) resta accettabile e funzionante
    www.valarsoft.com (Free GNU/GPL softwares and games)

  8. #8
    Originariamente inviato da nike_i6905
    Ma se omettevo di deallocare p, nella lista l'ultimo nodo lo avevo estratto lo stesso, semplicemente continuavo ad occupare la memoria dell'ultimo nodo, no?
    E quando dichiaro tdl=NULL non mi resta occupata lo stesso la memoria?
    se non deallochi p la memoria resta occupata (poichè in c non esiste alcun garbage collector)
    se scrivi tdl=NULL e basta azzeri tutta la lista ma tutta la memoria precedente resta occupata,
    ma ti ripeto, la funzione secondo me è fatta bene e dealloca la memoria come si conviene...

    www.valarsoft.com (Free GNU/GPL softwares and games)

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.