|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
La memoria
Cionci, guarda questo scorcio di programma che ad ogni passaggio
crea un nuovo spazio in memoria atto a contenere un'immagine, nel programma ne vengono caricate ben 100! Come gestisca ogni singolo puntatore alle singole immagini mi è oscuro ma la mia domanda è la seguente: possibile che con una semplice chiamata: delete MyImage la memoria allocata dalle 100 immagini viene deallocata tutta in un colpo solo? Usando le API di windows, sembrerebbe di si: occhio, ho usato il condizionale in quanto non ne sono affatto sicuro perchè: uscendo dal programma e rilanciando il medesimo più volte, la memoria totale fisica di sistema continua incessantemente a diminuire a te l'ardua sentenza TImage *MyImage = new TImage(Form1); for (int i =0; i <100; i++) { Image = new TImage(this); MyImage->Picture->LoadFromFile(FileListBox1->Items->Strings[i]) } delete MyImage; |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Re: La memoria
Image = new TImage(this);
Ma questo quando lo deallochi ? |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
mai, e qui sta il punto
prima di caricare le 100 immagini visualizzo la memoria disponibile con: _MEMORYSTATUS lp_membuf; GlobalMemoryStatus(&lp_membuf); StatusBar1->Panels->Items[1]->Text = (int)lp_membuf.dwAvailPhys; e dopo aver caricato le 100 immagini richiamo: _MEMORYSTATUS lp_membuf; GlobalMemoryStatus(&lp_membuf); StatusBar1->Panels->Items[1]->Text = (int)lp_membuf.dwAvailPhys; e calcolo la differenza che è sempre zero: questo non mi spiego possibile che chiamando il delete una sola volta e fuori dal loop venga deallocata tutta la memoria? |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No...però ci potrebbero essere meccanismi interni del BCB che fanno questo in automatico...
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
ho approfondito ed è tutto clamorosamente cannato il mio ragionamento perchè con:
delete MyImage fuori dal loop, viene cancellata solo l'ultima allocazione; le funzioni di gestione della memoria ritornano zero perchè l'indirizzo delle precedenti allocazioni viene perso per sempre: memory leak morale: BCB non dealloca automaticamente grazie cionci in ogni caso |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
pensa che se io scrivo:
TForm *Form2 = new TForm(this); TImage *MyImage = new TImage(Form2); for (int i =0; i <100; i++) { Image = new TImage(Form2); MyImage->Picture->LoadFromFile(FileListBox1->Items->Strings[i]) } ed ora scrivo delete Form2; viene cancellato tutto quanto allocato in un colpo solo; una caratteristica di BCB |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
come non detto, i problemi di memoria continuano
sapete se la memoria virtuale in windows è gestita automaticamente? grazie |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Non capisco ancora bene il tuo codice... Qaul'è l'oggetto che deve avere 100 istanze ? |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
in questo senso se tu compili il codice da me postato e lo utilizzi per visualizzare su un form 1500 immagini ad esempio; ti accorgerai che ad un certo punto verranno emessi dei messaggi di errore alquanto depistanti del tipo: "Canvas does not allow" questo mi ha fatto pensare che il codice da me postato utilizzi solo la ram fisica di sistema a meno che non si informi windows di ciò attraverso opportune funzioni anch'io ho sempre pensato che la memoria virtuale fosse gestita da windows in modo automatico ma gli strani messaggi e bada bene, non ripetibili, mi hanno depistato per questo chiedevo conferme |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
se state parlando di c++ (bcb e palle varie...)
Mi ricordo che nessuno si preoccupa di deallocare niente (al contrario del GarbageCollector Java per esempio).
Quindi ad ogni new qualcosa dovrebbe corrispondere un delete quel qualcosa. A meno che non si cancellino oggetti che hanno figli, ossia oggetti che avevano come parent o owner o qualcosa simile l'oggetto cancellato. Sono solo ricordi offuscati dal tempo passato da quando smanettavo col bcb... ah bei tempi!!! Quindi ditemi se ho sparato troppo grosso
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma quei 100 TImage quando li deallochi ??!?!?!
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
x Angus
tutto vero quanto hai detto x Cionci li dealloco solo al termine della visualizzazione, se li deallochi prima, non li visualizzi più |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
hai ragione ma, BCB offre anche questo che dovrebbe ricatturare il vecchio puntatore; almeno credo sia così:
for(int i=0; i < Form2->ComponentCount;i++) if(Form2->Components[i]->ClassNameIs("TImage")) { TImage *img = (TImage*)Form2->Components[i]; delete img; } |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
ho un dubbio
Quote:
Per essere sicuro in entrambi i casi potresti scrivere il codice in modo da mettere prima i riferimenti ai TImage in un vettore temporaneo e poi ciclare su quello.
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Re: ho un dubbio
Quote:
ho fatto delle prove e ad ogni TImage allocato ho salvato il puntatore su file quando dealloco, salvo nuovamente su file il puntatore di ogni TImage ritornato dalla: TImage *img = (TImage*)Form2->Components[i]; sino ad ora, dopo numerose prove, sono sempre i medesimi indirizzi la morale è che preferisco scrivere questo: TImage *MyImage; MyImage = new TImage(Form2); in luogo di questo: TImage *MyImage[100]; in quanto, con la prima, alloco memoria in modo dinamico faccio in questo modo perchè non vorrei sprecare prezioso spazio nella memoria stack BCB, se non ricordo male, ha di default 2 valori per l'area stack: min=4Kb max=100Kb ma quando compilo non so se crea automaticamente lo spazio necessario per tutte le variabili ed i vettori qualcuno mi ha detto che in teoria potrei scrivere anche: TImage *MyImage[1000000]; (un milione) di puntatori di tipo (TImage da 4 byte per puntatore), in quanto è esclusivamente in funzione della memoria del PC però così facendo sprecherei preziosa memoria mi ricordo che in turbo C, l'area stack doveva essere impostata con: __stklen(......) o similare se ho scritto qualche cavolata correggetemi pure |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
che storia!
Quote:
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Re: che storia!
Quote:
Ho già sperimentato anche questo ed il numero di componenti ritornati è sempre quello corretto. Stranamente, facendo girare il programma sotto win2k non si hanno i benchè minimi problemi. Il programma che sto sviluppando, per darti un'idea, è una sorta di ACDSee |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Re: Re: che storia!
Quote:
|
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
hmmm
Quote:
Se intendi dire che deallocando un componente il numero dei componenti totali diminuisce di uno, mi domando se quel ciclo for ti vada a pescare TUTTI i TImage. Mi spiego: Array Components: [Oggetto, TImage, TImage, Oggetto] ComponentCount = 4; quando i == 1 cancello il primo TImage. A questo punto come è fatto Components? Se fosse così: [Oggetto, TImage, Oggetto] ComponentCount = 3; allora i++ ti porterebbe a saltare un TImage... Se invece fosse cosà: [Oggetto, NULL, TImage, Oggetto] allora li beccheresti tutti. MAH! ps: vado a casa, a domani!
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:29.


















