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

    [C++] Problema distruttori

    Salve,

    ho queste 2 classi:

    codice:
    // 1° classe
    class Partita {
     char * SquadraA;
     char * SquadraB;
    
     public:
    [...]
      ~Partita ( ) { cout << "distruttore PARTITA" << endl; delete [] SquadraA; delete [] SquadraB; };
    };
    
    // 2° classe
    class Lista
    {
     Nodo * testa;
     
     public:
    [...]
      ~Lista ( ) {
    	Nodo * aux = testa;
    	
    	while ( testa )
    	{
    		cout << "distruttore LISTA" << endl;
    		aux = testa;
    		testa = testa->Nptr; // puntatore al prossimo Nodo
    		delete aux;
    	}
      }
    };
    Il problema sorge quando cerco di eseguire questo codice:
    codice:
    Lista * L = new Lista;
    Partita P;
    L.inserisciPartita ( P ); // inserisco una Partita nella Lista
    delete L;
    E' proprio "delete L;" che mi fa crashare il programma.
    Ma i costruttori son scritti giusti?
    Il risultato che mi stampa è:
    distruttore LISTA
    distruttore PARTITA
    e crasha.
    cosa c'è che non va nei distruttori?

    Ah, se ometto quel "delete L;" il programma termina correttamente.


    Grazie



  2. #2

    Re: [C++] Problema distruttori

    Originariamente inviato da ZoneForum

    codice:
    Lista * L = new Lista;
    Partita P;
    L.inserisciPartita ( P ); // inserisco una Partita nella Lista
    delete L;
    E' proprio "delete L;" che mi fa crashare il programma.
    Forse intendevi scrivere
    codice:
    L->inserisciPartita ( P );
    Anche se il codice che hai inviato è incompleto e non compilabile, si può intuire che ti vada in crash perché P viene distrutto dopo L.
    Per far distruggere P prima di L aggiungi un extra block:

    codice:
    Lista * L = new Lista;
    { // extra block
    	Partita P;
    	L->inserisciPartita ( P ); // inserisco una Partita nella Lista
    }
    delete L;
    ;-)

  3. #3
    Sì, scusa, ci voleva "->" e non "." (ho sbagliato nella copia del codice).

    Non male la tua idea, ma penso che sia più un "work-around" per risolvere il problema.

    Pochi minuti fa mi è venuta l'illuminazione ed ho risolto overloadando l'operatore di assegnazione della classe Partita:
    codice:
    const Partita & operator = ( const Partita & P );
    Praticamente prima mi assegnava l'indirizzo della variabile e non effettuava una vera e propia copia.
    Quindi deallocando la variabile "da cui proveniva" e poi rieseguendo il delete della stessa variabile (dal distruttore) crashava perchè già eliminata.

    Non so se mi son spiegato bene


    Grazie

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.