Newsgroup: it.comp.lang.visual-basic
Titolo: Domanda un po' cervellotica, ma interessante (credo!)

Dunque, l'altro giorno, lavorando con VB5Pro sp3 ho avuto la necessità
di utilizzare una quantità piuttosto grossa di instanze di uno stesso
oggetto (o classe che dir si voglia!) da me creato.
Infatti, l'istanza viene generata all'interno di una funzione
ricorsiva che chiama se stessa un numero piuttosto alto di volte
(circa 4000 volte, ma la cosa varia molto).
L'istanza la dichiaro con metodo classico:
dim a as new MiaClasse
all'inizio della funzione e alla fine la termino con
set a = Nothing
Ovviamente le istanze si accumulano in quanto (essendo la funzione
ricorsiva) chiama se stessa prima che l'istanza di MiaClasse venga
distrutta. Non posso calcolare quante instanze di MiaClasse ho
contemporaneamente.
Fatto sta che 2 volte su 5 il programma si inchioda con "Memoria
esaurita" (ho 128 Mb di RAM nel mio comp!),
La mia domanda è: VB ha un limite per il numero massimo di istanze
creabili per ogni classe oppure è VB che gestisce la memoria a schifo?
Grazie.
Marco F.

una ricorsione te le riporti dietro. 
Scusa la mia ignoranza, ma non ho capito! ^__^
Che itendi quando dici "un po' variabile per se stessa, un pò sono
quelle globali"?
Puoi spiegarti meglio?
Se le cose funzionano come in C++ per ogni istanza di classe si alloca
soltanto i dati delle variabili dichiarate come globali (sia pubbliche
che private nella classe) e quelle utilizzate nei metodi (o nelle
proprietà) vengono allocate soltanto quando servono (ma sinceramente
mi sa che VB funziona un po' diversamente vero?)
Ciao
Marco F.

Non è una questione di una gestione di memoria da schifo il problema è come
tu la gestisci, infatti ipotizzando che la tua procedura utilizzi un pò di
variabile per se stessa, un pò sono quelle globali, ogni volta che tu crei
una ricorsione te le riporti dietro. Ricordati comunque che tu non gestisci
tutti e 128 Mb di Ram, sarebbe troppo bello, io ne ho 64 e posso arrivare a
gestire(per impostazione del sistema forse si può cambiare) fino a 22 MB
circa
Ciao Zolfo

VB è del buon Bill, tanto per farti un esempio di ca.. che può fare io ho
fatto un progetto che senz immagini tiene 190 k con 1 sola immagine WMF di
58 k non so perchè ma me li porta a 340 K ??? Intendo che la procedura farà
riferimento alle variabili globali (e questo sempre) ed in più ci saranno
anche delle variabile proprie della procedura ossia dichiarate all'interno
che anche queste rimangono i memoria non per 1 sola volta ma se tu fai 5000
richiami ricorsivi ci saranno 5000 variabili aperte il che è... piuttosto
pesantuccio...
Ciao By Zolfo


Io ne ho anche perché ho appena dato un esame che comprendeva per l'appunto
l'esaminare il comportamento dello Stack con procedure ricorsive.
Ciao By Zolfo

i cicli ricorsivi...
Si. So come funziona lo stack (sia quello gestito direttamente dal
processore, che quello gestito da sistema operativo).
Bisogna vedere se il VB gestisce le funzioni ricorsive sovraccaricando
lo stack (cosa che in effetti temo...)
In ogni caso siamo sicuri che le variabili dichiarate all'interno di
una funzione vadano ad occupare memoria di stack (oppure occupano
normale memoria di sistema?).
Secondo me il problema non sta tanto nel fatto che si abbia a che fare
con la ricorsività, quanto nel fatto che troppe istanze di una
medesima classe il VB non riesce a gestirle (sarebbe le stessa cosa se
io, all'interno di un ciclo for, instanziassi migliaia di volte lo
stesso oggetto, o mi sbaglio?).
Ciao e grazie per la risposta.
Marco F.

togli la clausola As New dalla Dim
non la dovete usare mai!! (consiglio da "esperto")
usate la Set var = New ...
almeno cosi' sei sicuro di quando crei e quando distruggi un oggetto
poi prova a mettere un po' di Debug sulle Initialize e Terminate, e vedi se
capisci l'arcano

creabili per ogni classe oppure è VB che gestisce la memoria a schifo?
Sicuramente la seconda che hai detto, non so per la prima >:-)
--
Roal Zanazzi
z...@iol.it

stesso oggetto, o mi sbaglio?).
Dovrebbe essere cosi' (spero), ma da VB non si puo' mai sapere.
--
Roal Zanazzi
z...@iol.it

creabili per ogni classe oppure è VB che gestisce la memoria a schifo?
Non è tanto questione di memoria, quanto di Stack. Una funzione ricorsiva
del genere piazza di nuovo le variabili sullo stack ad ogni ricorsione (NB:
lo Stack non corrisponde alla memoria fisica del PC), e poichè lo Stack non
è infinito, dopo un po' collassa !
Il medico prescrive: tanta buona pazienza per cambiare l'algoritmo e ridurre
drasticamente il numero di ricorsioni prima, durante e dopo i pasti !! ^__^
PS: Mi pare che WinNT non sia soggetto a questi limiti, o che cmq li abbia
molto più alti (mi pare che lo Stack sia così limitato solo in sistemi a
16bit e in sistemi a 32bit ibridi)(NB: dimenticavo... anche in sistemi a
32bit implementati da skifo! [vedere comparazione WinNT-OS/2]) poichè
essendo il S.O. completamente a 32 bit non ha più quei fastidiosi Heap
limitati che invece in Win9x restano dato che parte del GDI e dell' User è
ancora a 16bit. (a dire il vero non è giusto dire "in parte", dato che GDI è
16bit per il 50%, e User lo è per il 90%)
Ricordo infatti una prova comparativa tra WinNT e OS/2 (versione 4 per
entrambi): entrambi i S.O. dovevano aprire un certo numero di finestre (non
ricordo bene ma mi pare fossero 5000 o giù di lì). Il risultato: nessun
problema per NT, crash di OS/2 intorno alle 2500 finestre.
Zeross
_______________________
Meditate gente, meditate !!!

ricordo bene ma mi pare fossero 5000 o giů di lě). Il risultato: nessun
