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

    [C++] Problema deallocazione dinamica

    Consideriamo il seguente esempio di allocazione dinamica tramite l'operatore new:


    codice:
    #include <iostream>
    using std::cout;
    using std::endl;
    
    
    
    int main()
    {
    	unsigned n = 0;
    	
    	for( char c = 'a'; c <= 'z'; ++c )
    		++n;
    
    	char *character = new char [ n ];
    
    	for( char c = 'a'; c <= 'z'; ++c )
    		character[ c-'a' ] = c;
    
    	delete [] character;
    
    	getc(stdin);
    	return 0;
    }
    Come si può facilmente notare determino innanzitutto il numero delle lettere dell'alfabeto (n = 26) e alloco dinamicamente un vettore di char della stessa dimensione. Successivamente assegno, nella corrispondente posizione del vettore, le lettere stesse (secondo loop).
    Dealloco il tutto con: delete [] character.
    Tutto normale nessun problema.

    Ma se io non conoscessi il valore esatto di n?

    Mi spiego meglio il codice seguente...


    codice:
    #include <iostream>
    using std::cout;
    using std::endl;
    
    
    
    int main()
    {
    	unsigned n = 0;
    	char *character = new char [ n ];
    
    	for( char c = 'a'; c <= 'z'; ++c )
    		character[ n++ ] = c;
    
    
    	delete [] character;  // ERRORE!
    
    	getc(stdin);
    	return 0;
    }

    Perchè si verifica l'errore nell'heap della memoria in corrispondenza dell'operazione di deallocazione dinamica della memoria (eseguendo il debug nessun problema fino a quel punto)?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [C++] Problema deallocazione dinamica

    Originariamente inviato da GliderKite
    codice:
      
    	unsigned n = 0;
    	char *character = new char [ n ];
    }
    Penso che sia chiaro il problema. Stai creando un vettore di zero elementi, ti sembra logica la cosa?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    SI, visto che stiamo parlando di un'allocazione dinamica e non statica...

    Oltretutto se anche avessi inizializzato n ad 1 l'errore (ripeto) si sarebbe presentato ugualmente e SOLO PER LA DEALLOCAZIONE.


    Edit: cmq penso di aver capito, si tratta di una standardizzazione del IDE che in modalità debug alloca autonomamente una quantità di memoria anche per n = 0; per questo non da errori in scrittura ma solo per la deallocazione...

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    La deallocazione è solo conseguenza dell'errore precedente.
    Per inciso, allocare 0 elementi è consentito (se non ricordo male in realtà ne viene allocato 1).
    Il problema è che sfori il limite dell'array. Al massimo ci stà un elemento, tu cerchi di infilarne 26!
    Ovvio che qualcosa succede.
    (Questa è una regola di buona programmazione: mai infilare in un array più elementi di quanti ne possa contenere).
    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.

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.