Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Výběr správné metody přidělování
Při výběru vhodného rozhraní API pro přidělení paměti pro váš scénář použijte následující doprovodné materiály:
| Scénář | Doporučené rozhraní API | Poznámky |
|---|---|---|
| Přidělení C++ pro obecné účely | new / std::make_unique / std::make_shared |
Výchozí volba pro kód jazyka C++. Používá haldu CRT interně. RAII zajišťuje automatické vyčištění. |
| Přidělení jazyka C pro obecné účely | malloc / calloc / realloc |
Výchozí volba pro kód jazyka C Přenosná napříč platformami. |
| Přidělení větší než ~1 MB nebo vyžadování ovládacího prvku na úrovni stránky | VirtualAlloc | Přiděluje členitost stránky (obvykle 4 kB). Slouží k rezervaci velkých rozsahů adres, strážných stránek nebo paměti s konkrétními atributy ochrany (PAGE_READWRITEatd PAGE_EXECUTE_READ.). |
| Mnoho malých přidělení pomocí vlastního ovládacího prvku (např. alokátor fondu) | HeapAlloc / HeapCreate | Vytvořte privátní haldu pro izolaci nebo serializaci řízení. Používejte HEAP_NO_SERIALIZE pouze v případě, že halda je výhradně jednovláknová. |
| Zprostředkovatele komunikace s objekty COM (zařazovaná paměť) | CoTaskMemAlloc | Vyžaduje se, když paměť překročí hranice bytu modelu COM. MIDL generované zástupné procedury používají CoTaskMemAlloc/CoTaskMemFree. |
| Starší verze kódu využívající přesunoutelnou paměť | GlobalAlloc / LocalAlloc | Vyhněte se novému kódu. Tyto operace přidávají režii nad heapAlloc a existují především kvůli zpětné kompatibilitě s operacemi schránky a určitými rozhraními API Win32, která je vyžadují. |
Important
Funkce přidělování a uvolnění vždy správně spárujte. Paměť přidělená pomocí musí být uvolněna HeapAllocHeapFree , nikoli free() nebo LocalFree. Kombinování rodin přidělení nebo zrušení přidělení způsobuje poškození haldy, které je obtížné diagnostikovat.
Note
VirtualAlloc vs HeapAlloc: VirtualAlloc funguje v členitosti stránky (minimálně 4 kB, rezervace zarovnané s SYSTEM_INFO.dwAllocationGranularity, obvykle 64 kB). Přidělování mnoha malých objektů pomocí virtualAllocu ztrácí adresní prostor. Použijte heapAlloc (nebo malloc/new) pro malé a časté přidělení. VirtualAlloc použijte, když potřebujete rezervovat velké oblasti adres, řídit ochranu stránky nebo implementovat vlastní alokátory.
Podrobné porovnání
Následuje stručné porovnání různých metod přidělování paměti:
- CoTaskMemAlloc
- GlobalAlloc
- HeapAlloc
- LocalAlloc
- Malloc
- new
- VirtualAlloc
Přestože funkce GlobalAlloc, LocalAlloc a HeapAlloc nakonec přidělují paměť ze stejné haldy, každá z nich poskytuje mírně odlišnou sadu funkcí. HeapAlloc může být například instruován k vyvolání výjimky, pokud paměť nelze přidělit, schopnost není k dispozici v LocalAlloc. LocalAlloc podporuje přidělení popisovačů, které umožňují přesunutí podkladové paměti relokací beze změny hodnoty popisovače, schopnost není k dispozici v HeapAlloc.
Počínaje 32bitovou Windows se globalAlloc a LocalAlloc implementují jako obálkové funkce, které volají HeapAlloc pomocí popisovače výchozí haldy procesu. Proto mají GlobalAlloc a LocalAlloc větší režii než HeapAlloc.
Vzhledem k tomu, že různé alokátory haldy poskytují charakteristické funkce pomocí různých mechanismů, musíte uvolnit paměť se správnou funkcí. Například paměť přidělená heapAlloc musí být uvolněna s HeapFree a nikoli LocalFree nebo GlobalFree. Paměť přidělená funkcí GlobalAlloc nebo LocalAlloc musí být dotazována, ověřena a vydána s odpovídající globální nebo místní funkcí.
Funkce VirtualAlloc umožňuje zadat další možnosti přidělení paměti. Přidělení ale používají členitost stránky, takže použití nástroje VirtualAlloc může vést k vyššímu využití paměti.
Funkce malloc má nevýhodu, že je závislá na době běhu. Nový operátor má nevýhodu závislého kompilátoru a závislého jazyka.
Funkce CoTaskMemAlloc má výhodu práce v jazyce C, C++ nebo Visual Basic. Je to také jediný způsob, jak sdílet paměť v aplikaci založené na modelu COM, protože MIDL používá CoTaskMemAlloc a CoTaskMemFree k zařazování paměti.
Examples
Příbuzná témata