Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C++] operatore delete

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    34

    [C++] operatore delete

    Ciao ragazzi, gentilmente c'è qualcuno che mi da una mano a capire come funziona l'operatore delete in C++?
    Integer è una classe semplice semplice che ha come data member un intero.
    Quale è la giusta sequenza di delete???


    codice:
    Integer * p = new Integer(9);
    Integer ** p2 = new Integer *;
    Integer *** p3 = new Integer **;
    
    p2 = &p;
    p3 = &p2;
    io farei:

    delete p;
    delete p2;
    delete p3;

    ...ma ovviamente non va bene, perchè?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non ha senso quello che fai, l'unica allocazione dinamica che devi fare è su p che deve puntare ad un oggetto. p2 e p3 non devono puntare ad alcun oggetto ma devono solo contenere degli indirizzi (rispettivamente di p e di p2).

    I tre puntatori p, p2 e p3 sono allocati staticamente. Quando vai ad allocare dinamicamente lo spazio per un oggetto per ogni puntatore, ne modifichi il valore ma poi dopo lo modifichi nuovamente facendo le assegnazioni

    p2 = &p;
    p3 = &p2;

    cioè a p2 e a p3 assegni indirizzi di variabili statiche, in quanto p e p2 lo sono (non confondere l'indirizzo del puntatore con l'indirizzo contenuto dal puntatore), tant'è che se stampi i valori dei puntatori subito dopo l'allocazione dinamica e subito dopo l'assegnazione ti renderai conto che cambiano. Nel momento in cui richiami la delete su p2 e p3 quindi stai provando a deallocare memoria assegnata staticamente (quella per i puntatori) e hai un errore run-time.

    Risolvi semplicemente non allocando nulla per p2 e p3 visto che non ne hai bisogno (in quanto a loro assegni solo degli indirizzi) e ovviamente non richiamando la delete su di loro.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    34
    mmm...ok.
    E se volessi dichiarare un array bidimensionale di N x M puntatori a Integer, come potrei rilasciare la memoria?

    codice:
    Integer*** array3 = new Integer** [N];
    for(int i = 0; i < M; i++)
    {
    	array3[i] = new Integer* [M];
    }
    
    k = 1;
    
    for(int i = 0; i<N; i++)
    {
    	for(int j = 0; j<M; j++)
    	{
    		array3[i][j] = new Integer(k++);
    			
    	}
    }
    
    cout << endl << endl;
    
    //stampa matrice
    for(int i = 0; i<N; i++)
    {
    	for(int j = 0; j<M; j++)
    	{
    		cout << array3[i][j]->getInt() << endl;
    	}
    }
    
    
    //rilascio della memoria
    for(int i = 0; i<N; i++)
    {
    	for(int j = 0; j<M; j++)
    	{
    		delete array3[i][j]; //richiama il distruttore della classe Integer
    	}
    }
    	
    for(int i = 0; i<M; i++)
    {
    	delete [] array3[i];
    }
    
    delete [] array3; //ERRORE, perchè?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    34
    mi rispondo da solo perchè ho trovato l'errore.
    Ho sbagliato un indice
    Il codice funzionante è questo:

    codice:
    //new e delete con Integer array bidimensionale N x M di puntatori ad Integer
    
    
    Integer*** array3 = new Integer ** [N];
    for(int i = 0; i < N; i++)     //QUI C'ERA L'ERRORE SULL'INDICE N
    {
    	array3[i] = new Integer * [M];
    	//*(array3 + i) = new Integer* [M];
    }
    
    k = 1;
    
    for(int i = 0; i<N; i++)
    {
    	for(int j = 0; j<M; j++)
    	{
    		//array3[i][j] = new Integer(k++);
    		*(*(array3 + i) + j) = new Integer(k++);
    	}
    }
    
    cout << endl << endl;
    
    //stampa matrice
    for(int i = 0; i<N; i++)
    {
    	for(int j = 0; j<M; j++)
    	{
    		cout << array3[i][j]->getInt() << endl;
    		//cout << (*(*(array3 + i) + j))->getInt() << endl;
    	}
    }
    
    for(int i = 0; i<N; i++)
    {
    	for(int j = 0; j<M; j++)
    	{
    		delete array3[i][j];
    	}
    
    	delete [] array3[i];
    }
    
    delete [] array3;


    P.S. esiste un modo alternativo per alloccare un array bidimensionale di puntatori?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.