Dubbio sull'overflow

di il
13 risposte

Dubbio sull'overflow

Buona sera a tutti, oggi mi sono imbattuto nel seguente esercizio:
"Un programma contiene il seguente codice per creare un array dinamico: int* entrata = new int [10]; Se non esiste sufficiente memoria nell'eap, la chiamata che precede new fallirà. Scrivere un codice che verifichi questa eventualità e visualizzi un apposito messaggio di errore."
Qui vi è il mio codice
#include <iostream>
using namespace std;

void overflow()
{
	cout << "La memoria e' piena";
	exit (1);
}


int main()
{
	int i;
	set_new_handler (overflow);
	for (i = 0; ; i++)
	{
		int* entrata = new int[10];
		cout << "Allocazione memoria: " << i << "byte" << endl;
	}
}
Mentre questo è un esempio che ci ha dato il professore
#include <iostream>
using namespace std;
int main()
{
 int* entrata;
 for (int i=0; ; i++) // ciclo infinito
 {
 entrata = new int[5];
 if (entrata == NULL)
 {
 cout << " memoria esaurita \n"; break;
 }
 cout << " assegnati " << i*10 << " KBytes \n";
 }
 return 0;
} 
La cosa che non capisco è, perché entrambi i programmi vanno all'infinito? Prendendo come esempio il primo codice, perché il ciclo for continua senza fermarsi occupando sempre byte. Navigando su internet ho letto che dipende dal tipo di compilatore usato, quindi come faccio a capire se un programma va in overflow? Grazie in anticipo

13 Risposte

  • Re: Dubbio sull'overflow

    1) leggi il manuale del compilatore
    2) cambia professore )
  • Re: Dubbio sull'overflow

    Non parliamo di overflow ma di out of memory.

    Normalmente la new nel C++ non restituisce NULL ma genera una eccezione std::bad_alloc

    E comunque non devi fare dei testi con 5 byte (non finirà più ...) ...

    Prova questo codice
    
    		try {
    			int i = 0;
    			while (true) {
    				int *mem = new int[100000000ul];
    				cout << ++i * 100000000ul << " bytes" << endl;
    			}
    		}
    		catch (const std::bad_alloc& e) {
    			std::cout << "Allocation failed: " << e.what() << '\n';
    		}
    
  • Re: Dubbio sull'overflow

    oregon ha scritto:


    Non parliamo di overflow ma di out of memory.

    Normalmente la new nel C++ non restituisce NULL ma genera una eccezione std::bad_alloc

    E comunque non devi fare dei testi con 5 byte (non finirà più ...) ...

    Prova questo codice
    
    		try {
    			int i = 0;
    			while (true) {
    				int *mem = new int[100000000ul];
    				cout << ++i * 100000000ul << " bytes" << endl;
    			}
    		}
    		catch (const std::bad_alloc& e) {
    			std::cout << "Allocation failed: " << e.what() << '\n';
    		}
    
    Grazie dell'aiuto ma ancora non sono arrivato a fare try e catch e non so qual è il loro effettivo utilizzo
  • Re: Dubbio sull'overflow

    nicolap ha scritto:


    1) leggi il manuale del compilatore
    2) cambia professore )
    Beh non è che il manuale sia tanto meglio, ti lascio qui un codice di esempio dell'overflow preso dal mio libro:
    #include <iostream>
    using namespace std;
    
    void overflow()
    {
    	cout << "Memoria insufficiente - fermare esecuzione" << endl;
    	exit (1);
    }
    
    int main()
    {
    	set_new_handler (overflow);
    	long dimensione;
    	int* pi;
    	int nblocco;
    	cout << "Dimensione desiderata?";
    	cin >> dimensione;
    	for (nblocco = 1; ; nblocco++)
    	{
    		pi = new int[dimensione];
    		cout << "Allocazione blocco numero: " << nblocco << endl;
    	}
    }
  • Re: Dubbio sull'overflow

    Eh ma il tuo professore doveva dirti qualcosa di più sulla questione di cosa restituisce la new ...

    Comunque, nel tuo codice scrivi
    Nel tuo codice scrivi
    
    [code]
    		int* entrata = new int[10000000ul];
    		cout << "Allocazione memoria: " << 10000000ul*(i+1) << " byte" << endl;
    		
    altrimenti quando finisci?
  • Re: Dubbio sull'overflow

    oregon ha scritto:


    Eh ma il tuo professore doveva dirti qualcosa di più sulla questione di cosa restituisce la new ...

    Comunque, nel tuo codice scrivi
    Nel tuo codice scrivi
    
    [code]
    		int* entrata = new int[10000000ul];
    		cout << "Allocazione memoria: " << 10000000ul*(i+1) << " byte" << endl;
    		
    altrimenti quando finisci?
    Grazie mille! Comnque vorrei chiederti cos'è quel "ul" alla fine del numero
  • Re: Dubbio sull'overflow

    Unsigned long

    Se vuoi che la new restituisca NULL in caso di problemi di allocazione devi scrivere

    entrata = new (nothrow) int[100000000ul];

    ma il tuo professore dovrebbe saperlo ...

    Il NULL lo utilizza la malloc ma è la funzione classica del C.
  • Re: Dubbio sull'overflow

    Il tuo professore ha sbagliato diverse cose, comunque se usi new il programma terminerà ma probabilmente con un eccezione invece di quello che vuoi

    Prova questo
    
    #include <iostream>
    using namespace std;
    
    int main(void)
    {
        int * entrata;
        for (int i = 1; 1; i++) // ciclo infinito
        {
            //entrata = new int[1024*1024];
            entrata = (int *)malloc(1024*1024*sizeof(int));
            if (entrata == NULL){
                cout << "memoria esaurita!" << endl; 
                break;
            }      
                cout << "assegnati " << i*sizeof(int) << " MB" << endl;
        }
        
        return 0;
    } 
    
    
  • Re: Dubbio sull'overflow

    Angelo99Franciamore ha scritto:


    nicolap ha scritto:


    1) leggi il manuale del compilatore
    2) cambia professore )
    Beh non è che il manuale sia tanto meglio, ti lascio qui un codice di esempio dell'overflow preso dal mio libro:
    Non sto parlando del libro di testo ma della documentazione del compilatore (che tra l'altro non nomini mai, male).
    Imparalo subito: per un programmatore la precisione è tutto.
  • Re: Dubbio sull'overflow

    Vabbé oregon sempre sul pezzo, non si riesce a scrivere
  • Re: Dubbio sull'overflow

    Grazie mille a tutti!

    nicolap ha scritto:


    Angelo99Franciamore ha scritto:


    nicolap ha scritto:


    1) leggi il manuale del compilatore
    2) cambia professore )
    Beh non è che il manuale sia tanto meglio, ti lascio qui un codice di esempio dell'overflow preso dal mio libro:
    Non sto parlando del libro di testo ma della documentazione del compilatore (che tra l'altro non nomini mai, male).
    Imparalo subito: per un programmatore la precisione è tutto.
    Aaah scusami avevo capito male, comunque dove posso trovare il manuale del compilatore? Io uso Dev-C++
  • Re: Dubbio sull'overflow

    Weierstrass ha scritto:


    Vabbé oregon sempre sul pezzo, non si riesce a scrivere
    Ma no ... stavo seguendo il thread ...
  • Re: Dubbio sull'overflow

    Angelo99Franciamore ha scritto:


    Grazie mille a tutti!

    nicolap ha scritto:


    Angelo99Franciamore ha scritto:



    Beh non è che il manuale sia tanto meglio, ti lascio qui un codice di esempio dell'overflow preso dal mio libro:
    Non sto parlando del libro di testo ma della documentazione del compilatore (che tra l'altro non nomini mai, male).
    Imparalo subito: per un programmatore la precisione è tutto.
    Aaah scusami avevo capito male, comunque dove posso trovare il manuale del compilatore? Io uso Dev-C++

    DevC++ non è un compilatore ma un IDE. Probabilmente utilizzi mingw ... In ogni caso devi studiare le specifiche del C++ perché, in questi casi, poco dipende dal compilatore. La new si deve comportare in quel modo con tutti i compilatori (seri).

    Quello su cui mi soffermerei è la questione del tuo professore ... lui si mi sembra da rivedere ...
Devi accedere o registrarti per scrivere nel forum
13 risposte