C dynamická alokace paměti - C dynamic memory allocation - Wikipedia
C standardní knihovna |
---|
Obecná témata |
Různé záhlaví |
C dynamická alokace paměti odkazuje na provedení manuální správa paměti pro dynamická alokace paměti v Programovací jazyk C. prostřednictvím skupiny funkcí v C standardní knihovna, jmenovitě malloc, realloc, calloc a volný, uvolnit.[1][2][3]
The C ++ programovací jazyk zahrnuje tyto funkce; nicméně, operátoři Nový a vymazat poskytují podobné funkce a jsou doporučovány autory daného jazyka.[4] Přesto existuje několik situací, kdy použití nový / smazat
není použitelné, například kód pro uvolnění paměti nebo kód citlivý na výkon, a kombinace malloc
a umístění nové
může být vyžadováno místo vyšší úrovně Nový
operátor.
Mnoho různých implementací skutečného mechanismu přidělování paměti, které používá malloc, jsou dostupné. Jejich výkon se liší jak v době provedení, tak v požadované paměti.
Odůvodnění
The Programovací jazyk C. spravuje paměť staticky, automaticky nebo dynamicky. Proměnné statického trvání jsou alokovány v hlavní paměti, obvykle spolu se spustitelným kódem programu, a přetrvávají po celou dobu životnosti programu; proměnné s automatickým trváním jsou přidělovány na zásobník a přicházejí a odcházejí, jak se funkce nazývají, a vracejí se. U proměnných statického trvání a automatického trvání musí být velikost alokace čas kompilace konstantní (s výjimkou automatických polí s proměnnou délkou[5]). Pokud není požadovaná velikost známa až do run-time (například pokud jsou data libovolné velikosti čtena od uživatele nebo ze souboru na disku), pak je použití datových objektů pevné velikosti nedostatečné.
Životnost přidělené paměti může také způsobit obavy. Statická ani automatická paměť není vhodná pro všechny situace. Automaticky přidělená data nemohou přetrvávat napříč více voláními funkcí, zatímco statická data přetrvávají po celou dobu životnosti programu, ať už je to potřeba nebo ne. V mnoha situacích vyžaduje programátor větší flexibilitu při správě životnosti přidělené paměti.
Těmto omezením se lze vyhnout použitím dynamická alokace paměti, ve kterém je paměť spravována explicitněji (ale pružněji), obvykle přidělením z obchod zdarma (neformálně nazývaná „halda“), oblast paměti strukturovaná pro tento účel. V jazyce C je funkce knihovny malloc
se používá k přidělení bloku paměti na haldě. Program přistupuje k tomuto bloku paměti pomocí a ukazatel že malloc
se vrací. Když už paměť není potřeba, ukazatel se předá volný, uvolnit
který uvolní paměť, aby ji bylo možné použít pro jiné účely.
Původní popis C to naznačoval calloc
a cfree
byly ve standardní knihovně, ale ne malloc
. Kód pro jednoduchou implementaci modelu správce úložiště pro Unix dostal s alokace
a volný, uvolnit
jako funkce uživatelského rozhraní a pomocí sbrk
systémové volání k vyžádání paměti z operačního systému.[6] Dokumentace k Unixu 6. vydání dává alokace
a volný, uvolnit
jako funkce přidělení paměti na nízké úrovni.[7] The malloc
a volný, uvolnit
rutiny v jejich moderní podobě jsou zcela popsány v Unixovém manuálu k 7. vydání.[8][9]
Některé platformy poskytují knihovnu nebo vnitřní funkce volání, která umožňují dynamickou alokaci za běhu ze zásobníku C, nikoli z haldy (např. alloca ()
[10]). Tato paměť se automaticky uvolní, když skončí volací funkce.
Přehled funkcí
Funkce přidělování dynamické paměti C jsou definovány v stdlib.h
záhlaví (cstdlib
záhlaví v C ++).[1]
Funkce | Popis |
---|---|
malloc | přiděluje zadaný počet bajtů |
realloc | zvětší nebo zmenší velikost zadaného bloku paměti a v případě potřeby jej přesune |
calloc | přidělí zadaný počet bajtů a inicializuje je na nulu |
volný, uvolnit | uvolní zadaný blok paměti zpět do systému |
Rozdíly mezi malloc ()
a calloc ()
malloc ()
trvá jediný argument (velikost paměti, která má být přidělena v bajtech), whilecalloc ()
potřebuje dva argumenty (počet proměnných, které se mají přidělit v paměti, a velikost jedné proměnné v bajtech).malloc ()
neinicializuje přidělenou paměť, zatímcocalloc ()
zaručuje, že všechny bajty bloku přidělené paměti byly inicializovány na 0.- V některých operačních systémech
calloc ()
lze implementovat tak, že nejprve nasměrujete všechny stránky virtuálních adres přidělené paměti na stránku pouze pro čtení všech 0 s a alokujete fyzické stránky pouze pro čtení a zápis, když jsou virtuální adresy zapsány, metoda s názvem kopírovat při zápisu.
Příklad použití
Vytváření pole deseti celých čísel s automatickým rozsahem je v C:
int pole[10];
Velikost pole je však pevná v době kompilace. Pokud si přejete dynamicky přidělit podobné pole, lze použít následující kód:
int *pole = malloc(10 * velikost(int));
Tím se spočítá počet bajtů, které deset celých čísel zabírá v paměti, a potom se požaduje, aby z nich bylo mnoho bajtů malloc
a přiřadí výsledek a ukazatel pojmenovaný pole
(z důvodu syntaxe C lze v některých situacích ukazatele a pole použít zaměnitelně).
Protože malloc
nemusí být schopen požadavek vybavit, může vrátit a nulový ukazatel a je dobré si to ověřit:
int *pole = malloc(10 * velikost(int));-li (pole == NULA) { fprintf(stderr, "malloc selhal n"); vrátit se -1;}
Když program již nepotřebuje dynamické pole, musí nakonec zavolat volný, uvolnit
Chcete-li vrátit paměť, kterou zabírá, do bezplatného úložiště:
volný, uvolnit(pole);
Paměť odložená stranou malloc
není inicializováno a může obsahovat cruft: zbytky dříve použitých a vyřazených dat. Po přidělení s malloc
, prvky pole jsou neinicializované proměnné. Příkaz calloc
vrátí alokaci, která již byla vymazána:
int *pole = calloc(10, velikost(int));
S realloc můžeme změnit velikost paměti, na kterou ukazuje ukazatel. Například pokud máme ukazatel fungující jako pole velikosti a chceme to změnit na pole velikosti , můžeme použít realloc.
int *přílet = malloc(2 * velikost(int));přílet[0] = 1;přílet[1] = 2;přílet = realloc(přílet, 3 * velikost(int));přílet[2] = 3;
Uvědomte si, že je třeba předpokládat, že realloc změnil základní adresu bloku (tj. Pokud nedokázal rozšířit velikost původního bloku, a proto přidělil nový větší blok jinde a zkopíroval do něj starý obsah). Proto již nejsou platné žádné ukazatele na adresy v původním bloku.
Typ bezpečnosti
malloc
vrací a ukazatel neplatnosti (neplatné *
), což znamená, že jde o ukazatel na oblast neznámého datového typu. Použití castingu je v C ++ vyžadováno kvůli systému silného typu, zatímco toto není případ C. Jeden může „cast“ (viz převod typu ) tento ukazatel na konkrétní typ:
int *ptr;ptr = malloc(10 * velikost(*ptr)); / * bez obsazení * /ptr = (int *)malloc(10 * velikost(*ptr)); / * s obsazením * /
Provedení takového obsazení má své výhody a nevýhody.
Výhody odlévání
- Zahrnutí obsazení může programu C nebo funkci umožnit kompilaci jako C ++.
- Obsazení umožňuje verze před rokem 1989 z
malloc
který původně vrátil achar *
.[11] - Casting může pomoci vývojáři identifikovat nekonzistence v dimenzování typů, pokud se změní typ cílového ukazatele, zvláště pokud je ukazatel deklarován daleko od
malloc ()
call (ačkoli moderní překladače a statické analyzátory mohou varovat před takovým chováním, aniž by vyžadovaly obsazení[12]).
Nevýhody lití
- Podle standardu C je obsazení nadbytečné.
- Přidání obsazení může maskovat selhání zahrnutí záhlaví
stdlib.h
, ve kterém funkční prototyp promalloc
je nalezeno.[11][13] Při absenci prototypu promalloc
, standard C90 vyžaduje, aby kompilátor C předpokládalmalloc
vrátíint
. Pokud není obsazení, vyžaduje C90 diagnostiku, když je toto celé číslo přiřazeno ukazateli; s obsazením by se však tato diagnostika nevytvořila a skryla by chybu. Na určitých architekturách a datových modelech (například LP64 v 64bitových systémech, kdedlouho
a ukazatele jsou 64bitové aint
je 32bitová), tato chyba může ve skutečnosti vést k nedefinovanému chování, jak je implicitně deklarovánomalloc
vrátí 32bitovou hodnotu, zatímco skutečně definovaná funkce vrátí 64bitovou hodnotu. V závislosti na konvenci volání a rozložení paměti to může mít za následek rozbíjení zásobníku. Je méně pravděpodobné, že tento problém v moderních kompilátorech zůstane nepovšimnutý, protože C99 neumožňuje implicitní deklarace, takže kompilátor musí vytvořit diagnostiku, i když předpokládáint
vrátit se. - Pokud se typ ukazatele změní při jeho deklaraci, bude pravděpodobně také nutné změnit všechny řádky, kde
malloc
je povolán a obsazen.
Běžné chyby
Nesprávné použití dynamického přidělování paměti může být často zdrojem chyb. Mezi ně mohou patřit bezpečnostní chyby nebo pády programu, nejčastěji kvůli poruchy segmentace.
Nejběžnější chyby jsou následující:[14]
- Nekontroluji selhání přidělení
- Není zaručeno úspěšné přidělení paměti a místo toho může vrátit nulový ukazatel. Použití vrácené hodnoty bez kontroly, zda je alokace úspěšná, vyvolá nedefinované chování. To obvykle vede k havárii (kvůli výsledné chybě segmentace na dereference nulového ukazatele), ale neexistuje žádná záruka, že dojde k havárii, takže spoléhání se na to může také vést k problémům.
- Úniky paměti
- Selhání uvolnění paměti pomocí
volný, uvolnit
vede k nahromadění jednorázové paměti, kterou program již nepoužívá. Tím dochází k plýtvání paměťovými prostředky a při vyčerpání těchto prostředků může dojít k selhání alokace. - Logické chyby
- Všechna alokace se musí řídit stejným vzorem: alokace pomocí
malloc
, využití k ukládání dat, deallocation pomocívolný, uvolnit
. Nedodržení tohoto vzoru, například využití paměti po volánívolný, uvolnit
(visící ukazatel ) nebo před hovorem namalloc
(divoký ukazatel ), volánívolný, uvolnit
dvakrát („double free“) atd., obvykle způsobí poruchu segmentace a vyústí v selhání programu. Tyto chyby mohou být přechodné a je obtížné je ladit - například uvolněná paměť obvykle není operačním systémem OS okamžitě obnovena, a tak visící ukazatele mohou na chvíli přetrvávat a vypadat, že fungují.
Kromě toho, jako rozhraní, které předchází standardizaci ANSI C, malloc
a přátelé mají chování, které bylo záměrně ponecháno na implementaci, aby si je mohli sami definovat. Jedním z nich je alokace nulové délky, se kterou je spíše problém realloc
protože je častější měnit velikost na nulu.[15] Ačkoli oba POSIX a Single Unix Specification vyžadovat správné zpracování alokací nulové velikosti buď vrácením NULA
nebo něco jiného, co lze bezpečně osvobodit,[16] ne všechny platformy jsou povinny se těmito pravidly řídit. Mezi mnoha dvojitými chybami, k nimž to vedlo, je rok 2019 WhatsApp RCE byla obzvláště prominentní.[17] Způsob, jak tyto funkce zabalit, aby byly bezpečnější, je jednoduše zkontrolovat přidělení velikosti 0 a přeměnit je na funkce velikosti 1. (Vrácení NULA
má své vlastní problémy: v opačném případě označuje nedostatek paměti. V případě realloc
signalizovalo by to, že původní paměť nebyla přesunuta a uvolněna, což opět neplatí pro velikost 0, což vede k dvojité volnosti.)[18]
Implementace
Implementace správy paměti do značné míry závisí na operačním systému a architektuře. Některé operační systémy dodávají alokátor pro malloc, zatímco jiné dodávají funkce pro ovládání určitých oblastí dat. K implementaci obou se často používá stejný dynamický alokátor paměti malloc
a operátor Nový
v C ++.[19]
Haldy
Implementace alokátoru se běžně provádí pomocí halda nebo datový segment. Alokátor obvykle rozšíří a zkrátí haldu, aby splnil požadavky na přidělení.
Metoda haldy trpí několika inherentními vadami, které zcela pocházejí z fragmentace. Jako každá metoda přidělení paměti bude i halda fragmentovaná; to znamená, že v alokovaném prostoru na haldě budou části použité a nevyužité paměti. Dobrý alokátor se pokusí najít nevyužitou oblast již přidělené paměti k použití, než se uchýlí k rozšíření haldy. Hlavní problém s touto metodou spočívá v tom, že halda má pouze dva významné atributy: base nebo začátek haldy ve virtuálním paměťovém prostoru; a délka nebo její velikost. Halda vyžaduje dostatek systémové paměti k vyplnění celé její délky a její základna se nikdy nemůže změnit. Tak jsou zbytečné jakékoli velké oblasti nevyužité paměti. Halda se může na této pozici „zaseknout“, pokud na konci haldy existuje malý použitý segment, který by mohl plýtvat jakýmkoli množstvím adresního prostoru. U líných schémat přidělování paměti, jako jsou ty, které se často nacházejí v operačním systému Linux, velká hromada nemusí nutně rezervovat ekvivalentní systémovou paměť; udělá to pouze při prvním zápisu (čtení nemapovaných stránek paměti vrátí nulu). Podrobnost závisí na velikosti stránky.
dlmalloc a ptmalloc
Doug Lea vyvinula veřejná doména dlmalloc („Doug Lea's Malloc“) jako univerzální alokátor, počínaje rokem 1987. The Knihovna GNU C. (glibc) je odvozen z ptmalloc („pthreads malloc“) Wolframa Glogera, vidlice dlmalloc s vylepšeními souvisejícími s vlákny.[20][21][22] Od listopadu 2019 je nejnovější verzí dlmalloc verze 2.8.6 ze srpna 2012.[23]
dlmalloc je alokátor hraničních značek. Paměť na halda je přiděleno jako „bloky“, což je 8 bajtů zarovnaný datová struktura který obsahuje záhlaví a použitelnou paměť. Přidělená paměť obsahuje režii 8 nebo 16 bajtů pro velikost bloku a příznaky použití (podobné a drogy vektor ). Nepřidělené bloky také ukládají ukazatele na další volné bloky v oblasti použitelného prostoru, takže minimální velikost bloku 16 bajtů na 32bitových systémech a 24/32 (v závislosti na zarovnání) bajtů na 64bitových systémech.[21][23](2.8.6, Minimální přidělená velikost)
Nepřidělená paměť je seskupena do „koše "podobných velikostí, implementováno pomocí dvojitého seznamu bloků (s ukazateli uloženými v nepřiděleném prostoru uvnitř bloku). Koše jsou tříděny podle velikosti do tří tříd:[21][23](Překryté datové struktury)
- U požadavků pod 256 bajtů (požadavek „smallbin“) se používá jednoduchý alokátor nejlépe vyhovující dvěma výkonům. Pokud v tomto zásobníku nejsou žádné volné bloky, blok z dalšího nejvyššího zásobníku se rozdělí na dvě.
- Pro žádosti o 256 bajtů nebo více, ale pod mmap práh, dlmalloc od použití v2.8.0 na místě bitové trie algoritmus („stromovka“). Pokud k uspokojení požadavku nezbývá žádné volné místo, pokusí se dlmalloc zvětšit velikost haldy, obvykle prostřednictvím brk systémové volání. Tato funkce byla představena po vytvoření ptmalloc (z v2.7.x) a ve výsledku není součástí glibc, který zdědí starý nejvhodnější alokátor.
- U požadavků nad prahovou hodnotu mmap (požadavek "largebin") je paměť vždy přidělena pomocí mmap systémové volání. Prahová hodnota je obvykle 256 kB.[24] Metoda mmap odvrací problémy s obrovskými vyrovnávacími pamětí, které na konci po vypršení platnosti zachycují malou alokaci, ale vždy přiděluje celou strana paměti, která na mnoha architekturách má velikost 4096 bajtů.[25]
Vývojář her Adrian Stone to tvrdí dlmalloc
, jako alokátor hraničních značek, je nepřátelský pro konzolové systémy, které mají virtuální paměť, ale nemají stránkování poptávky. Je to proto, že jeho zmenšující se a rostoucí zpětná volání fondu (sysmalloc / systrim) nelze použít k alokaci a potvrzení jednotlivých stránek virtuální paměti. Při absenci stránkování poptávky se fragmentace stává větší obavou.[26]
Jemalloc FreeBSD a NetBSD
Od té doby FreeBSD 7,0 a NetBSD 5.0, starý malloc
implementace (phkmalloc) byla nahrazena jemalloc, napsal Jason Evans. Hlavním důvodem byla nedostatečná škálovatelnost phkmalloc, pokud jde o multithreading. Aby se zabránilo sporu o zámek, používá jemalloc pro každou samostatnou „arénu“ procesor. Experimenty s měřením počtu alokací za sekundu v aplikaci s více vlákny ukázaly, že díky tomu je měřítko lineární s počtem vláken, zatímco u phkmalloc i dlmalloc byl výkon nepřímo úměrný počtu vláken.[27]
OpenBSD malloc
OpenBSD implementace malloc
funkce využívá mmap. U požadavků větších než jedna stránka se celá alokace načte pomocí mmap
; menší velikosti jsou přiřazeny z fondů paměti udržovaných malloc
v rámci několika „kbelíkových stránek“, také přidělených mmap
.[28][je zapotřebí lepší zdroj ] Na volání volný, uvolnit
, paměť je uvolněna a nezmapována z procesu adresní prostor použitím munmapa
. Tento systém je navržen tak, aby zlepšil zabezpečení využitím výhod randomizace rozvržení adresního prostoru a funkce stránky s mezerami implementované jako součást OpenBSD mmap
systémové volání, a detekovat chyby po použití zdarma - protože velká alokace paměti je po uvolnění zcela nezmapována, další použití způsobí Porucha Segmentace a ukončení programu.
Hromadit malloc
Hoard je alokátor, jehož cílem je škálovatelný výkon alokace paměti. Stejně jako alokátor OpenBSD používá Hoard mmap
výhradně, ale spravuje paměť v blocích 64 kilobajtů nazývaných superbloky. Hromada hromádky je logicky rozdělena na jednu globální hromadu a několik hromád na procesor. Kromě toho existuje místní mezipaměť podprocesu, která pojme omezený počet superbloků. Přidělením pouze ze superbloků na místní haldě na vlákno nebo na procesor a přesunutím většinou prázdných superbloků do globální haldy, aby je bylo možné znovu použít jinými procesory, udržuje Hoard nízkou fragmentaci a dosahuje téměř lineární škálovatelnosti s počtem vláken .[29]
mimalloc
A open-source kompaktní obecný účel alokátor paměti z Microsoft Research se zaměřením na výkon.[30] Knihovna je asi 11 000 řádky kódu.
Malloc pro ukládání mezipaměti vlákna (tcmalloc)
Každé vlákno má a místní úložiště vláken pro malé alokace. Pro velké alokace mmap nebo sbrk může být použito. TCMalloc, a malloc vyvinutý společností Google,[31] má sběr odpadků pro místní ukládání mrtvých vláken. TCMalloc je považován za více než dvakrát rychlejší než ptmalloc glibc pro vícevláknové programy.[32][33]
V jádře
Operační systém jádra je třeba přidělit paměť stejně jako aplikační programy. Implementace malloc
v jádře se však často významně liší od implementací používaných knihovnami C. Například paměťové vyrovnávací paměti možná bude muset odpovídat zvláštním omezením uloženým v DMA nebo může být funkce přidělení paměti volána z kontextu přerušení.[34] To vyžaduje a malloc
implementace úzce integrovaná s virtuální paměť subsystém jádra operačního systému.
Převažující malloc
Protože malloc
a jeho příbuzní mohou mít silný dopad na výkon programu, není neobvyklé přepsat funkce pro konkrétní aplikaci vlastními implementacemi, které jsou optimalizovány pro vzory přidělení aplikace. Standard C neposkytuje žádný způsob, jak toho dosáhnout, ale operační systémy nalezly různé způsoby, jak toho dosáhnout využitím dynamického propojení. Jedním ze způsobů je jednoduše propojit v jiné knihovně a přepsat symboly. Další zaměstnaná u Systém Unix V.3, je udělat malloc
a volný, uvolnit
ukazatele funkcí, které může aplikace obnovit na vlastní funkce.[35]
Omezení velikosti alokace
Největší možný blok paměti malloc
může přidělit závisí na hostitelském systému, zejména na velikosti fyzické paměti a implementaci operačního systému.
Teoreticky by největší číslo mělo být maximální hodnotou, kterou lze v a size_t
typ, což je nepodepsané celé číslo závislé na implementaci představující velikost oblasti paměti. V C99 standard a novější, je k dispozici jako SIZE_MAX
konstantní od <stdint.h>
. Ačkoli to ISO C nezaručuje, obvykle je 2 ^ (CHAR_BIT * velikost (size_t)) - 1
.
Na systémech glibc největší možný blok paměti malloc
může přidělit je jen polovina této velikosti, a to 2 ^ (CHAR_BIT * velikost (ptrdiff_t) - 1) - 1
.[36]
Rozšíření a alternativy
Implementace knihovny C dodávané s různými operačními systémy a kompilátory mohou přicházet s alternativami a rozšířeními standardu malloc
rozhraní. Pozoruhodný mezi nimi je:
aloka
, který přiděluje požadovaný počet bajtů na zásobník volání. Neexistuje žádná odpovídající funkce uvolnění, protože paměť se obvykle uvolní, jakmile se vrátí volající funkce.aloka
byl přítomen na unixových systémech již 32 / V (1978), ale jeho použití může být problematické v některých (např. Vložených) kontextech.[37] I když je podporováno mnoha překladači, není součástí ANSI-C standard, a proto nemusí být vždy přenosné. Může to také způsobit drobné problémy s výkonem: vede to k rámcům zásobníku proměnné velikosti, takže k oběma ukazatele zásobníku a rámečku je třeba spravovat (u rámců zásobníku pevné velikosti, jeden z nich je nadbytečný).[38] Větší alokace mohou také zvýšit riziko nedefinovaného chování v důsledku a přetečení zásobníku.[39] C99 nabídl pole proměnné délky jako alternativní mechanismus alokace zásobníku - tato funkce však byla později převedena na volitelnou C11 Standard.- POSIX definuje funkci
posix_memalign
který přiděluje paměť se zarovnáním podle volajícího. Jeho alokace jsou uvolněnyvolný, uvolnit
,[40] implementace tedy obvykle musí být součástí knihovny malloc.
Viz také
Reference
- ^ A b Specifikace ISO / IEC 9899: 1999 (PDF). p. 313, § 7.20.3 „Funkce správy paměti“.
- ^ Godse, Atul P .; Godse, Deepali A. (2008). Pokročilé programování C.. p. 6-28: Technické publikace. p. 400. ISBN 978-81-8431-496-0.CS1 maint: umístění (odkaz)
- ^ Summit, Steve. „Kapitola 11: Přidělení paměti“. C Poznámky k programování. Citováno 2020-07-11.
- ^ Stroustrup, Bjarne (2008). Programování: Principy a praxe s využitím C ++. 1009, §27.4 Obchod zdarma: Addison Wesley. p. 1236. ISBN 978-0-321-54372-1.CS1 maint: umístění (odkaz)
- ^ "gcc manual". gnu.org. Citováno 2008-12-14.
- ^ Brian W. Kernighan, Dennis M. Ritchie, Programovací jazyk C., Prentice-Hall, 1978; Část 7.9 (strana 156) popisuje
calloc
acfree
a Oddíl 8.7 (strana 173) popisuje implementaci proalokace
avolný, uvolnit
. - ^ Verze 6 Unix Programátor Manuál –
- ^ Verze 7 Unix Programátor Manuál –
- ^ Anonymní, Unix Programmer's Manual, Vol. 1Holt Reinhart a Winston, 1983 (autorská práva společnosti Bell Telephone Laboratories, 1983, 1979); The
muž
stránka promalloc
atd. je uvedeno na straně 275. - ^ FreeBSD Funkce knihovny Manuál –
- ^ A b „Casting malloc“. Cprogramming.com. Citováno 2007-03-09.
- ^ "clang: lib / StaticAnalyzer / Checkers / MallocSizeofChecker.cpp zdrojový soubor". clang.llvm.org. Citováno 2018-04-01.
- ^ "comp.lang.c Seznam FAQ · Otázka 7.7b". C-FAQ. Citováno 2007-03-09.
- ^ Reek, Kenneth (04.08.1997). Ukazatele na C. (1. vyd.). Pearson. ISBN 9780673999863.
- ^ "MEM04-C. Pozor na alokace nulové délky - SEI CERT C Coding Standard - Confluence". wiki.sei.cmu.edu.
- ^ "POSIX.1-2017: malloc". pubs.opengroup.org. Citováno 2019-11-29.
- ^ Probuzený. „Jak se chyba bez dvojitých chyb v WhatsApp změní na RCE“. Citováno 2019-11-29.
- ^ Felker, Rich (10.03.2019). „Páni. WhatsApp RCE bylo nesprávné chování pro realloc (p, 0), na kterém tolik implementací trvá. Https://twitter.com/ottom6k/status/1179623539726524417…“. Cvrlikání. Citováno 2019-11-29. Externí odkaz v
| název =
(Pomoc) - ^ Alexandrescu, Andrei (2001). Moderní design v C ++: Platí obecné programovací a návrhové vzory. Addison-Wesley. p. 78.
- ^ „Domovská stránka malloc Wolframa Glogera“. malloc.de. Citováno 2018-04-01.
- ^ A b C Kaempf, Michel (2001). „Vudo malloc tricks“. Phrack (57): 8. Archivováno od původního dne 2009-01-22. Citováno 2009-04-29.
- ^ „Glibc: Malloc Internals“. sourceware.org Trac. Citováno 2019-12-01.
- ^ A b C Lee, Doug. „Alocator paměti“. Citováno 2019-12-01. HTTP pro zdrojový kód
- ^ "Nastavitelné parametry Malloc". GNU. Citováno 2009-05-02.
- ^ Sanderson, Bruce (12. 12. 2004). „RAM, virtuální paměť, stránkovací soubor a všechny tyto věci“. Nápověda a podpora společnosti Microsoft.
- ^ Kámen, Adrian. „Díra, kterou dlmalloc nemůže zaplnit“. Hra Angst. Citováno 2019-12-01.
- ^ Evans, Jason (2006-04-16). „Škálovatelná souběžná implementace malloc (3) pro FreeBSD“ (PDF). Citováno 2012-03-18.
- ^ „libc / stdlib / malloc.c“. Křížový odkaz BSD, OpenBSD src / lib /.
- ^ Berger, E. D .; McKinley, K. S.; Blumofe, R. D .; Wilson, P. R. (listopad 2000). Poklad: Škálovatelný alokátor paměti pro vícevláknové aplikace (PDF). ASPLOS -IX. Sborník příspěvků z deváté mezinárodní konference o architektonické podpoře programovacích jazyků a operačních systémů. 117–128. CiteSeerX 10.1.1.1.4174. doi:10.1145/378993.379232. ISBN 1-58113-317-0.
- ^ Microsoft vydává optimalizovaný malloc () jako open source - Slashdot
- ^ Domovská stránka TCMalloc
- ^ Ghemawat, Sanjay; Menage, Paul; TCMalloc: Malloc s mezipamětí vláken
- ^ Callaghan, Mark (18.01.2009). „High Availability MySQL: Double sysbench throughput with TCMalloc“. Mysqlha.blogspot.com. Citováno 2011-09-18.
- ^ "kmalloc () / kfree () zahrnout / linux / slab.h". People.netfilter.org. Citováno 2011-09-18.
- ^ Levine, John R. (2000) [říjen 1999]. „Kapitola 9: Sdílené knihovny“. Linkery a nakladače. Řada Morgan Kaufmann v softwarovém inženýrství a programování (1. vyd.). San Francisco, USA: Morgan Kaufmann. ISBN 1-55860-496-0. OCLC 42413382. ISBN 978-1-55860-496-4. Archivováno z původního dne 2012-12-05. Citováno 2020-01-12. Kód: [1][2] Errata: [3]
- ^ "malloc: způsobit selhání malloc u požadavků větších než PTRDIFF_MAX". Sourceware Bugzilla. 2019-04-18. Citováno 2020-07-30.
- ^ „Proč se použití alloca () nepovažuje za dobrou praxi?“. stackoverflow.com. Citováno 2016-01-05.
- ^ Amarasinghe, Saman; Leiserson, Charles (2010). „6.172 Výkonové inženýrství softwarových systémů, přednáška 10“. MIT OpenCourseWare. Massachusetts Institute of Technology. Archivovány od originál dne 22.06.2015. Citováno 2015-01-27.
- ^ „alloca (3) - Linuxová manuální stránka“. man7.org. Citováno 2016-01-05.
- ^ Specifikace Single UNIX, Vydání 7 od Otevřená skupina - Reference systémových rozhraní,
externí odkazy
- Definice malloc ve standardu IEEE Std 1003.1
- Lea, Doug; Návrh základu alokátoru glibc
- Gloger, Wolfram; Domovská stránka ptmalloc
- Berger, Emery; Domovská stránka Hoard
- Douglas, Niall; Domovská stránka nedmalloc
- Evans, Jason; Domovská stránka jemalloc
- Jednoduché algoritmy přidělení paměti v komunitě OSDEV
- Michael, Maged M .; Škálovatelné dynamické přidělování paměti bez nutnosti uzamčení
- Bartlett, Jonathan; Správa vnitřní paměti - Volby, kompromisy a implementace dynamické alokace
- Redukce paměti (GNOME) wiki stránka s mnoha informacemi o opravě malloc
- Standardní návrh C99, včetně TC1 / TC2 / TC3
- Některé užitečné odkazy o C.
- ISO / IEC 9899 - Programovací jazyky - C.
- Pochopení glibc malloc