Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Scelta del metodo di allocazione corretto
Usare le indicazioni seguenti per selezionare l'API di allocazione di memoria appropriata per lo scenario:
| Scenario | API consigliata | Note |
|---|---|---|
| Allocazioni C++ per utilizzo generico | new / std::make_unique / std::make_shared |
Scelta predefinita per il codice C++. Usa internamente l'heap CRT. RAII garantisce la pulizia automatica. |
| Allocazioni C per utilizzo generico | malloc / calloc / realloc |
Scelta predefinita per il codice C. Portabile su più piattaforme. |
| Allocazioni maggiori di ~1 MB o richiesta del controllo a livello di pagina | Virtualalloc | Alloca in corrispondenza della granularità della pagina (in genere 4 KB). Usare per riservare intervalli di indirizzi di grandi dimensioni, pagine di protezione o memoria con attributi di protezione specifici (PAGE_READWRITE, PAGE_EXECUTE_READe così via). |
| Molte allocazioni di piccole dimensioni con controllo personalizzato (ad esempio, allocatore di pool) | HeapAlloc / HeapCreare | Creare un heap privato per il controllo di isolamento o serializzazione. Usare HEAP_NO_SERIALIZE solo se l'heap è esclusivamente a thread singolo. |
| Interoperabilità COM (memoria con marshalling) | CoTaskMemAlloc | Obbligatorio quando la memoria supera i limiti degli apartment COM. Gli stub generati da MIDL usano CoTaskMemAlloc/CoTaskMemFree. |
| Codice legacy con memoria spostabile | GlobalAlloc / LocalAlloc | Evitare per il nuovo codice. Questi aggiungono overhead su HeapAlloc ed esistono principalmente per garantire la compatibilità con le versioni precedenti con le operazioni degli Appunti e alcune API Win32 che le richiedono. |
Importante
Associare sempre correttamente le funzioni di allocazione e deallocazione. La memoria allocata con HeapAlloc deve essere liberata con HeapFree , non free() o LocalFree. La combinazione di famiglie di allocazioni/deallocazione causa un danneggiamento dell'heap difficile da diagnosticare.
Note
VirtualAlloc vs HeapAlloc: VirtualAlloc opera con granularità di pagina (almeno 4 KB, prenotazioni allineate a SYSTEM_INFO.dwAllocationGranularity, in genere 64 KB). Allocando molti oggetti di piccole dimensioni con VirtualAlloc si spreca lo spazio indirizzi. Usare HeapAlloc (o malloc/new) per allocazioni frequenti di piccole dimensioni. Usare VirtualAlloc quando è necessario riservare aree di indirizzi di grandi dimensioni, proteggere la pagina di controllo o implementare allocatori personalizzati.
Confronto dettagliato
Di seguito è riportato un breve confronto dei vari metodi di allocazione della memoria:
- CoTaskMemAlloc
- Globalalloc
- HeapAlloc
- LocalAlloc
- Malloc
- Nuovo
- VirtualAlloc
Sebbene le funzioni GlobalAlloc, LocalAlloc e HeapAlloc allocano la memoria dallo stesso heap, ognuna fornisce un set leggermente diverso di funzionalità. Ad esempio, HeapAlloc può essere richiesto di generare un'eccezione se non è stato possibile allocare memoria, una funzionalità non disponibile con LocalAlloc. LocalAlloc supporta l'allocazione di handle che consentono lo spostamento della memoria sottostante da una riallocazione senza modificare il valore dell'handle, una funzionalità non disponibile con HeapAlloc.
A partire da Windows a 32 bit, GlobalAlloc e LocalAlloc vengono implementati come funzioni wrapper che chiamano HeapAlloc usando un handle per l'heap predefinito del processo. Pertanto, GlobalAlloc e LocalAlloc hanno un sovraccarico maggiore rispetto a HeapAlloc.
Poiché i diversi allocatori heap forniscono funzionalità distintive usando meccanismi diversi, è necessario liberare memoria con la funzione corretta. Ad esempio, la memoria allocata con HeapAlloc deve essere liberata con HeapFree e non LocalFree o GlobalFree. La memoria allocata con GlobalAlloc o LocalAlloc deve essere eseguita una query, convalidata e rilasciata con la funzione globale o locale corrispondente.
La funzione VirtualAlloc consente di specificare opzioni aggiuntive per l'allocazione di memoria. Tuttavia, le allocazioni usano una granularità di pagina, quindi l'uso di VirtualAlloc può comportare un utilizzo maggiore della memoria.
La funzione malloc presenta lo svantaggio di essere dipendente dal runtime. Il nuovo operatore presenta lo svantaggio di essere dipendente dal compilatore e dipendente dal linguaggio.
La funzione CoTaskMemAlloc ha il vantaggio di funzionare correttamente in C, C++o Visual Basic. È anche l'unico modo per condividere la memoria in un'applicazione basata su COM, poiché MIDL usa CoTaskMemAlloc e CoTaskMemFree per effettuare il marshalling della memoria.
Examples
Argomenti correlati