PDA

Visualizza la versione completa : C - Win32 - Oltre new, delete, malloc, free


XWolverineX
22-09-2008, 12:19
Salve a tutti.
Gironzonlando su MSDN, mi sono accorto di come le API di Windows32 forniscono funzioni per la gestione della memoria. Ma, essendoci new e delete, non mi sono mai preoccupato della loro utilità

Ora però vorrei cercare di capire la loro utilità.
In particolare ho visto GlobalAlloc( che sembra deprecata), HeapAlloc e VirtualAlloc(e la sua versione Ex che prende anche un'altro processo in esecuzione)

Sapete dirmi usi, utilità, pregi, difetti?

shodan
22-09-2008, 12:53
Che io sappia new e malloc sono costruite attorno a quelle funzioni, per cui io non sento il bisogno di usare funzioni API per la gestione della memoria.
Sicuramente invocandole per molte allocazioni possono risultare più veloci, però si limitano a restituire blocchi di memoria grezzi (come malloc) e non invocano costruttori e distruttori.
Potrebbero essere utili per casi particolari ma non so indicare quali (forse device driver).

XWolverineX
22-09-2008, 14:36
Lo sospettavo anche io, ma vorrei capirne in generale di piu'
Che differenza c'è tra Virtual ed Heap, per esempio.

MItaly
22-09-2008, 16:09
Oltre a quanto detto da shodan, devi considerare che alcune di quelle funzioni vengono usate in casi speciali: ad esempio quando si devono richiamare delle funzioni che esigono che la memoria sia allocata in una certa maniera (ad esempio le API della clipboard) o quando si deve deallocare della memoria allocata in una certa maniera da una funzione (molte API ti dicono di liberare la memoria allocata da loro con GlobalFree). Spesso l'obbligo di usare una certa famiglia di API per allocare/deallocare la memoria deriva da un "passaggio di proprietà" della memoria: una API che restituisce un buffer allocato dinamicamente ne cede la proprietà al chiamante, il quale dovrà occuparsi di deallocarlo con la funzione adeguata (accade anche il caso opposto, come nel caso delle API della clipboard).
Inoltre diverse famiglie di funzioni fanno cose diverse; le Globalxxx e le Localxxx sono deprecate e non sono altro che dei wrapper attorno alle loro controparti Heapxxx; vengono usate fondamentalmente in codice legacy e quando bisogna lavorare con le API DDE e della clipboard (anche se molti le usano quando devono semplicemente allocare memoria senza le finezze delle Heapxxx).
Le Globalxxx e le Localxxx erano molto usate sotto Windows prima di Windows NT e Windows 95, perché ai tempi non esistevano gli spazi di indirizzi virtuali, per cui i puntatori puntavano effettivamente alla memoria fisica del sistema, e quindi allocare della memoria con malloc (che per lo standard ANSI restituisce un puntatore) significava cedere fino alla free della memoria fisica (che era pochissima, tra l'altro) ad un singolo programma, senza che il sistema la potesse gestire come meglio credeva. Per ovviare a questo inconveniente furono create le Globalxxx e le Localxxx, che venivano usate di solito con il flag GMEM_MOVEABLE, che consentiva al sistema di spostare il blocco di memoria nella RAM dove riteneva fosse meglio. Le applicazioni ottenevano un puntatore a tale memoria solo quando serviva effettivamente chiamando la Global/LocalLock con l'handle restituito dalla Global/LocalAlloc, e rilasciavano tale puntatore con la Global/LocalUnlock. In questa maniera il sistema sapeva che l'applicazione non aveva più puntatori a tale blocco di memoria, e quindi sapeva di poterlo spostare dove gli pareva in caso di necessità.
Tutto questo ci insegna che noi due siamo fortunati ad essere nati dopo che Windows è stato dotato di spazi d'indirizzi, memoria virtuale e tutte queste belle cose che ci risparmiano grandi casini (e questo che ti ho citato non è l'unico né il peggiore).
Le Heapxxx servono per allocare memoria in un heap del processo; sono più flessibili rispetto alle funzioni standard C e rispetto alle Globalxxx perché ti consentono di usare più di un heap nonché di effettuare operazioni avanzate su di esso (ad esempio compattarlo, validarlo, controllare che blocchi di memoria sono stati allocati).
Le Virtualxxx sono le funzioni più flessibili ma anche più di basso livello: consentono di manipolare le pagine di memoria del processo, in modo da tentare di allocare memoria ad uno specifico indirizzo di memoria, proteggere pagine di memoria (in modo che venga sollevata un'eccezione hardware quando si tenta di scriverle o di leggerle), riservare della memoria senza allocarla, monitorare gli accessi alla memoria, creare guard pages e altro ancora.

XWolverineX
22-09-2008, 17:37
Che trattato: preciso e corretto. Utilissimo.

Meriterebbe davvero di diventare una pillola.

MItaly
22-09-2008, 19:11
Grazie :); tra l'altro se ti interessano queste stranezze di Windows e i loro motivi di ordine storico o di retrocompatibilità, dai un'occhiata a questo blog (http://blogs.msdn.com/oldnewthing/default.aspx).

Loading