Newsgroup: it.comp.lang.delphi
Titolo: Una domandina facile facile....

Ciao a tutti!
Per la serie "tragico ma vero", qualcuno sa spiegarmi perche le istruzioni
che seguono lasciano allocati 4kb di memoria?
    A    = Array [0..9048] Of Char;
    P    = ^A;
    ....
    .....
    Begin
       New(P);
       FillMemory (P,0);
       Dispose(P):
    End;
Ogni volta che eseguo questo pezzo di codice la mia memoria disponibile
scende di 4kb qualcuno ha già incontrato il problema?
Grazie a tutti!
Carlo.

scende di 4kb qualcuno ha già incontrato il problema?
Prova a togliere il FillMemory :)
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
--------------------------------------------------------------
"Partire e' un po' morire e morire e' partire un po' troppo !"
--------------------------------------------------------------

 --
Fatto ma non sembra cambiare molto....
Aiutooooooooooooo

        FillMemory (P,0);
e poi il FillMemory va fatto sul contenuto di P
FillMemory (P^,0);
Ciao, Sandro

Secondo l'help inoltre la FillMemory ha 3 parametri, il secondo e' la
dimensione dell'area da riempire, dunque:
FillMemory (P^,sizeof(A),0);
non ho provato il codice ma dovrebbe funzionare.
Ciao, Sandro


Ciao,
purtroppo l'allocazione e il dipose della memoria nel mio programma non
avvengono nella stessa procedura, inoltre l'allocazione è effettuata
all'interno di un thread ma non credo che questo cambi molto...
con il task manager rilevo un aumento di occupazione di 4kb ogni volta anche
se disalloco correttamente la memoria....
Tnx.
Carlo.

 ha scritto nel messaggio
news:8o3qdn$a01sn$1...@ID-43509.news.cis.dfn.de...

Scusa nel codice che ho scritto ci sono un po di inesattezze, il codice
giusto è questo :
    A    = Array [0..9048] Of Char;
    P    = ^A;
    ....
    .....
   Var
      X : P;
    Begin
       New(X);
       FillMemory (X,9048,0);
       ......
       Dispose(X):
    End;

     End;
mi sembra impossibile che il TMM di delphi sbagli a deallocare
il vettore, l'unica cosa che mi viene in mente e' che tu abbia
dichiarato P due volte in modo diverso e che nel modulo
del thread sia visto come un array di 9048 bytes
mentre la dispose veda P come un puntatore ad array di
4096 bytes (per cui perdi circa 4K di memoria).
una possibilita' meno probabile e' che deallochi il vettore
piu' di una volta...



 piu' di una volta...
Scusa in questo caso che può accadere?
Grazie.
Carlo.

 Scusa in questo caso che può accadere?
Access Violation. Che puo' essere segnalata o meno, e comunque ti porta ad
incongruenze nella gestione della memoria.
Per inciso, a me e' capitato con un gestionale piuttosto complesso, grazie
al task manager di W2K ho tenuto sotto controllo l'utilizzo della memoria
nell'allocazione/deallocazione di alcune form create a runtime. Beh
succedeva una cosa piuttosto strana. Con l'allocazione ad esempio si passava
da 8 Mb di memoria occupata a 9 Mb, con la distruzione della form si tornava
a 8,5 Mb, ma una successiva allocazione portava l'utilizzo della memoria a
9. Insomma, non si tratta di un leak ma della gestione della memoria da
parte del sistema operativo, che a quanto pare non e' esattamente matematica
come succedeva in dos.
Ciao, Sandro

 Scusa in questo caso che può accadere?
puo' succedere di tutto...  :-)

Fatto ma non sembra cambiare molto....
Scusa, ma come fai a controllare che la memoria disponibile diminuisce
?
Tieni presente che i valori del Task Manager, sotto NT, variano
continuamente...


you wrote:

E' sbagliato.
Il primo parametro di FillMemory e' un puntatore.


 Il primo parametro di FillMemory e' un puntatore.
hai ragione, non ci avevo fatto caso. Quindi, venendo al punto, una
procedura come:
type a=array [1..10] of char;
var p:^a;
begin
 new(p);
 fillmemory(p,10,100);
 dispose(p);
end;
deve per forza funzionare, e non genera leak, salvo errori del programmatore
che alloca/dealloca male in punti diversi del programma, senza controlli,
ecc.ecc.
Ciao, Sandro


Non lo so mi sembrava di avere tutto sotto controllo... Ma chi lo può dire,
comunque ho risolto!
Ho tolto tutti i puntatori e uso dei memory stream per passare i dati fra i
vari thread ora funziona!
Grazie a tutti i vostri suggerimenti!
Alla prox.
Carlo.

vari thread ora funziona!
Vorrei precisare che questo tipo di problemi non sono attribuibili ai
puntatori, ma all'uso che si fa di essi.
