candaluar ha scritto:
Dipende da te: la funzione realloc potrebbe ritornare un booleano per indicare che la realloc è riuscita oppure no, lasciando a più alto livello la segnalazione all'utente che la memoria è esaurita; oppure potresti sollevare allo stesso modo un'eccezione da raccogliere e gestire a più alto livello
in effetti penso sia la cosa più furba ritornare un bool.
candaluar ha scritto:
Se il buffer non è stato allocato devi uscire, non lo puoi utilizzare; non c'è bisogno di try/catch, se il buffer non è stato allocato lo sai e quindi esci dalla funzione.
ora che ci penso hai ragione, anziché usare un try/catch (che a quanto so è abbastanza oneroso in termini di prestazioni) penso che risolverei il problema meglio con il classico "if (pointer == NULL) ....".
+m+ ha scritto:
In generale è molto difficile che un vettore non venga allocato, era un problema comune con le modalità a 16 bit, ora a 32bit capita per vettori sopra il gigabyte, per 64bit spesso il limite effettivo (per Windows) è dell'ordine di qualche decina di gigabyte.
Quindi, nel caso specifico, un messaggio del tipo "houston abbiamo un problema" ci può stare, con terminazione anche piuttosto brutale.
beh, una volta c'ero riuscito: ero curioso su cosa stampasse il messaggio d'errore dell'eccezione (e.what()) allora ho fatto un for che da capacità 5 continuava a riallocare l'array per 100 volte e alla fine il povero debugger mi dice "memoria esaurita"
+m+ ha scritto:
Invece sul programma ti segnalo che invece di fare *2 e /2 puoi fare (nel primo caso) una somma (o addirittura uno shift), così come nel secondo caso. i++ normalmente viene scritto ++i
in effetti non so quanto sia logico un *2 (l'avevo scritto perché non mi veniva in mente): dato che questo tavolo gestisce un tavolo di scopa penso sia inutile raddoppiare ogni volta la dimensione, bensì possa essere sufficiente incrementarla soltanto di 1.
sul ++i/i++ però ho un dubbio: in un for non va messo i++? perché altrimenti i verrebbe incrementato prima di iniziare il ciclo for, o sbaglio?