Newsgroup: it.comp.programmare.win32
Titolo: Memoria esaurita... :-( help

Ciao, sto facendo un programma di simulazione in C++ con modalità Win32
console application. Questo programma mi ha portato a scrivere tantissimo
codice e fare tante allocazioni di memoria con il costrutto new. Purtroppo
deve girare con delle iterazioni del valore di milioni...dovrebbe essere
corretto e si
ferma per valori al di sotto del milione di iterazioni dando valori sensati,
solo che quando
provo con 2 milioni, ad un certo punto (ma lo stesso punti di ogni volta che
provo perchè ho
cronometrato il tempo) mi dice che la memoria è esaurita, che Windows prova
con la virtuale ma che ci sono dei problemi e bla bla bla...ok, ho esaurito
la memoria probabilmente con le new senza fare degli opportuni delete che mi
sono sfuggiti. La domanda è...può essere solo questo il problema?
E poi, per fare una prova ulteriore ho provato a scrivere questo codice:
 for(i=0;i<max;i++)   double * dep = new double[10000000];
alloco max volte 10 milioni di doulbe
con max esageratamente alto (o comunque anche con doppio ciclo)...niente da
fare!  il programma non fa come con il mio, si ferma correttamente e
stampando a video il valore di
indirizzo di dep mi da solo il valore di memoria 0X00820040 e tutti i
successivi 0x00000000
se provo con uno 0 in meno riesce ad allocarne 20 e poi per tutte le altre
pone dep= 0x00000000.
Come mai non mi da problemi di memoria esaurita? Che se ne accorga e risolve
il problema fregandosene e non allocando memoria per successive allocazioni
che superino un valore fisso (che fra l'altro pare sia dell'ordine di
0x09280040). Aiuto! Ditemi come ragiona sta console win32 e ditemi se è
proprio e solo un problema di eccessive new senza delete sfuggiti al
controllo!
Grazie!

Rispondo a me stesso. Ho provato a guardare messaggi vecchi su google e un
tipo ha indicato un pezzetto di programma che ti esaurisce la memoria dopo
pochi secondi, il pezzetto č:
 for( int i = 0; i < 100000; i++ )
      char *buf = new char[ 1024*1024 ];
E' vero, funziona, questa volta mi visualizza lo stesso messaggio di errore
del mio simulatore...ma perchč con l'esempio  for(i=0;i<max;i++)   double *
dep = new double[10000000];     NON ME LO DICE?????????
Va beh, ora almeno so che nel mio simulatore č mooolto probabile che sia
scappato qualche delete...

Ok, tutto a posto...c'erano vari delete nascostissimi quasi introvabili.
Forse ho anche disturbato troppo, comunque può servire ad altri...memoria
esaurita---> delete persi
CIAO

 proprio e solo un problema di eccessive new senza delete sfuggiti al
Innanzitutto, se vai a leggere sulla guida di riferimento del compilatore
(qualunque tu usi), dovrebbe esserci scritto da qualche parte che
l'allocazione dinamica della memoria con l'operatore new va a buon fine
(cioè esiste memoria e l'alloca al tuo programma) solo quando assegna al
puntatore un valore diverso da NULL (0x00000000). Quindi, quando tu andavi
ad allocare memoria non allocavi memoria ma se memorizzavi dati, andavi a
scrivere in qualche punto imprecisato della memoria oppure ti si poteva
schiantava il programma o addirittura il sistema operativo (le versione w2k
e xpPro dovrebbero prevedere attraverso il so di scrivere in spazi di
memoria del sistema e quindi prevenire il crash della macchina). è buona
norma con la programmazione dinamica controllare che l'invocazione del new
(o della malloc) vada a buon fine, altrimenti non è possibile prevedere cosa
succeda.
Poi, può succedere che alcune versioni dei linguaggi di programmazione
abbiano qualche baco e non effettuino una corretta compilazione del codice
ignorando alcuni delete presenti nel codice ed in questo caso, per
esperienza personale, la situazione è molto complessa da analizzare e solo
una fase di debug molto delicata e complessa porta ad identificare il
problema che il relativo service pack corregge ampiamente.
La mancanza delle DELETE può essere ritenuto un errore minimo in un
programmino che viene lanciato e termina la computazione in tempi ristretti
mentre se l'applicazione dovesse essere operativa molte ore al giorno, l'uso
dell'allocazione dinamica senza i meccanismi di deallocazione porterebbe a
dover riavviare l'applicazione molte volte al giorno al fine di deallocare
(o almeno si spera) la memoria utilizzata e ripristinare una situazione
"pulita".
Comunque l'allocazione dinamica della memoria PREVEDE l'uso della delete in
modo da non lasciare spazzatura nella memoria del sistema perdendo i
relativi puntatori.
Alessandro