|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
[C] Allocazione/Deallocazione memoria
Un saluto a tutti.
Avrei un dubbio sul funzionamento del seguente codice sorgente Codice:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
typedef struct _prova {
long *c;
char *s;
} prova;
int main() {
char wait;
printf("creo");
scanf("%c",&wait);
prova *p = malloc(sizeof(prova)*1000000);
int i=0;
for (; i<1000000; i++){
p[i].c=malloc(sizeof(long));
p[i].s=malloc(sizeof(char)*10);
}
printf("creato");
scanf("%c",&wait);
for (i = 0; i<1000000; i++){
free(p[i].c);
free(p[i].s);
}
free(p);
printf("eliminato");
scanf("%c",&wait);
}
Il problema e' il seguente: guardando il processo associato al sorgente nel task manager, nonostante l'eliminazione di tutto il vettore, vedo che al processo e' associata parecchia memoria (come se la free non funzionasse); Qualcuno saprebbe spiegarmi il motivo? Grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Il problema e' il seguente: guardando il processo associato al sorgente nel task manager, nonostante l'eliminazione di tutto il vettore, vedo che al processo e' associata parecchia memoria (come se la free non funzionasse);
Qualcuno saprebbe spiegarmi il motivo? Grazie[/quote] prova con la fflush()
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
provato con Codeblocks 10.05 sotto Windows 7 professional 32 bit ed il processo occupa pochi kb dopo il messaggio di eliminazione del vettore.
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2007
Messaggi: 2267
|
Se Freaxxx ha ragione, allora può essere che Windows non liberi le pagine occupate dal processo ma non più utilizzate.
__________________
Concluso con:... |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
per inciso l'ho provato su una macchina con AMD C50, ovvero una macchina con CPU e Northbridge ( e GPU ) integrati in un solo package, quindi il controller di memoria è integrato nel DIE della CPU, i tempi di accesso in memoria sono particolarmente brevi con queste nuove APU/CPU, magari tu lo provi su una piattaforma con controller di memoria esterno e montato sulla scheda madre.
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Penso dipenda dal sistema operativo e dal modo in cui alloca (e dealloca) memoria ai programmi. Ma potrebbe dipendere anche dall'ambiente di sviluppo...
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
in linea teorica si, ma assumendo per vero il fatto che passi per la scheda madre, c'è anche da includere come possibili variabili le prestazioni dei driver del chipset della scheda madre.
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
L'hardware è a disposizione diretta del sistema operativo, tratta i dati per quel che sono e non si preoccupa di altro. Quello che ti dice "gli indirizzi di memoria da 0x00000 a 0x000FF sono allocati" non è l'hardware, ma l'OS. Se l'OS invia un comando di dealloc, quell'area di memoria verrà in ogni caso liberata con una serie di istruzioni che la macchina esegue ad occhi chiusi e l'OS considera quell'area di memoria vuota e quindi non allocata, e anche se l'hardware non l'avesse liberata (penso che tra l'altro l'hardware non faccia niente) non importa, sarà marcata libera. Le istruzioni di deallocazione sono corrette, probabilmente l'ambiente di sviluppo le tiene allocate perchè magari è in qualche particolare forma di debug. Quello che voglio dire è che driver, hardware, bios ecc... possono certamente influenzare la velocità di allocazione e deallocazione, ma deallocare 22mB (se ho fatto i conti giusti con puntatori da 32bit) è una operazione da qualche microsecondo pure per un processore 486... Dipende da come l'ambiente di sviluppo (se il programma viene lanciato da lì) o l'OS decide di gestire l'allocazione (gestione che tra l'altro è, e deve essere, totalmente trasparente al programma e all'utente).
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 22-10-2011 alle 18:30. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
ops doppio
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
Quote:
per quanto riguarda le varie modalità debug e i motivi per i quali non liberare subito una porzione di memoria non mi esprimo perché sono ovviamente tante le possibilità; magari prova anche tu con codeblocks. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
se si programma sotto windows questi problemi di memoria si verificano spesso.
sotto linux non ho mai visto questi problemi. Il codice mi sembra giusto, e quindi se lo testi su una macchina linux dovrebbe filare tutto liscio.
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Penso che sia un qualche passaggio nella gestione ad alto livello (software) della memoria, probabilmente una scelta implementativa, ma concordo che stiamo parlando del sesso degli angeli, ci sono troppe variabili da considerare
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Se c'e' da cercare una causa per la memoria che non viene liberata, i primi indiziati sono proprio malloc/free (modalita' di debug, flag di compilazione etc.) Detto questo su VS2010 e Windows 7 funziona regolarmente. Con che Compilatore/SO ti accade ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Ringrazio tutti per le diverse risposte.
Quindi il codice sorgente è corretto. Non ho specificato, sto sviluppando un progetto in C sotto ambiente unix, più precisamente: ubuntu 10.04 kernel 2.6.35-30-generic L'hardware su cui sto provando è il seguente: processore: core i5-460m memoria: 4gb ram Non ho ancora provato a fare la fflush, ora vedo se mi risolve questo problema. Ad ogni modo, potrebbe essere che il processo libera la memoria, tuttavia se la "tiene" riservata per future allocazioni?? Ringrazio tutti |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Il riuso della memoria allocata e poi liberata e' una delle tecniche utilizzate da una malloc per migliorare le performance.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:29.




















