Jak pracovat s dynamickým přidělením paměti C ++?



Tento článek zkoumá dynamické přidělování paměti v C ++, což je důležitá funkce, která vám umožní zvážit vaše paměťové potřeby pro prostředky v reálném čase.

Dynamická alokace paměti V C ++ je velmi důležitá funkce, která vám umožní zvážit vaše požadavky a vypořádat se s potřebou zdrojů v reálném čase. V tomto článku budeme zkoumat Podrobný průzkum. Následující ukazatele budou popsány v tomto článku,

Pojďme tedy začít s tímto článkem o dynamickém přidělování paměti v C ++





Potřebujete dynamickou alokaci paměti?

Řekněme, že chceme zadat větu jako pole znaků, ale nejsme si jisti přesným počtem znaků požadovaným v poli.

Nyní, když deklarujeme pole znaků, pokud zadáme jeho velikost menší než velikost požadovaného řetězce, dostaneme chybu, protože místo v paměti přidělené poli je menší ve srovnání s velikostí vstupního řetězce. Pokud zadáme jeho velikost větší než velikost vstupního řetězce, pak bude matici v paměti přiděleno místo, které je mnohem větší než velikost požadovaného řetězce, čímž zbytečně spotřebovává více paměti, i když to není nutné.



Ve výše uvedeném případě nemáme představu o přesné velikosti pole až do doby kompilace (když počítač zkompiluje kód a řetězec zadá uživatel). V takových případech používáme Nový operátor.

C ++ definuje dva unární operátory Nový a vymazat které provádějí úlohu přidělování a uvolňování paměti za běhu. Protože tito operátoři (noví a mazaní) pracují s pamětí volného úložiště (paměť haldy), nazývají se také operátorem volného obchodu. Ukazatele poskytují nezbytnou podporu pro systém dynamického přidělování paměti v C ++.

S pomocí dynamické alokace může program získat paměť za běhu.



Globální a místní proměnné jsou přiděleny do paměti během kompilace. Během běhu však nemůžeme přidat žádné globální ani místní proměnné. Pokud program potřebuje použít proměnné množství paměti, museli bychom přidělit paměť za běhu, podle potřeby. A samozřejmě zde mohou sloužit rutiny dynamické alokace.

Rozdíly mezi statickou alokací paměti a dynamickou alokací paměti:

Toto je základní architektura paměti používaná pro jakýkoli program v C ++:

Paměť - dynamická alokace paměti - Edureka

Budeme potřebovat takový obrázek

Zásobník se používá k přidělení statické paměti a halda k dynamickému přidělení paměti, obě jsou uloženy v paměti RAM počítače.

Proměnné, které se přidělují na zásobníku, zatímco přidělování statické paměti se ukládá přímo do paměti a přístup k této paměti je velmi rychlý, jeho přidělení se řeší také při kompilaci programu. Když funkce nebo metoda volá jinou funkci, která by zase mohla volat jinou funkci atd., Provádění všech těchto funkcí zůstane pozastaveno, dokud poslední funkce nevrátí svou hodnotu. Zásobník je vždy uložen v pořadí LIFO (last in first out), naposledy rezervovaný blok je vždy dalším blokem, který má být uvolněn. To pomáhá udržet přehled o zásobníku, uvolnění bloku ze zásobníku není nic jiného než úprava jednoho ukazatele.

Proměnné přidělené na haldě mají svoji paměť přidělenou za běhu při dynamickém přidělování paměti. Přístup k této paměti je ve srovnání se zásobníkem o něco pomalejší, ale velikost haldy je omezena pouze velikostí virtuální paměti. Prvek hromady nemá žádné vzájemné závislosti a lze k němu kdykoli v libovolném okamžiku přistupovat náhodně. Blok můžeme kdykoli přidělit a kdykoli uvolnit. Díky tomu je obtížné sledovat, které části haldy jsou v daném okamžiku přiděleny nebo uvolněny.

Pokračujeme tímto článkem o dynamickém přidělování paměti v C ++

Přidělení paměti pomocí Nový Klíčové slovo

V C ++ Nový operátor se používá k přidělení paměti za běhu a paměť je přidělena v bajtech. The Nový operátor označuje požadavek na dynamické přidělení paměti na haldě. Pokud je k dispozici dostatek paměti, pak Nový operátor inicializuje paměť a vrátí adresu nově přidělené a inicializované paměti do proměnné ukazatele.

Syntax:

datový typ * pointer_name = nový datový typ

Příklad:

int * ptr = new int // Proměnnou při dynamické alokaci můžeme deklarovat následujícími dvěma způsoby. int * ptr = new int (10) int * ptr = new int {15} // operátor new se také používá k přidělení bloku (pole) paměti typu data-type. int * ptr = new int [20] // Výše ​​uvedený příkaz dynamicky přiděluje paměť pro 20 celých čísel nepřetržitě typu int a vrací ukazatel na první prvek sekvence na ukazatel „ptr“.

Poznámka : Pokud halda nemá dostatek paměti k alokaci, nový požadavek označuje selhání vyvoláním výjimky std :: bad_alloc, pokud není s novým operátorem použit „nothrow“, v takovém případě vrátí ukazatel NULL. Proto je dobrým zvykem před použitím v programu zkontrolovat proměnnou ukazatele vytvořenou novým.

Fibonacci v C ++

Pokračujeme tímto článkem o dynamickém přidělování paměti v C ++

Dělení paměti pomocí vymazat Klíčové slovo:

Jakmile je halda přidělena paměti objektu proměnné nebo třídy pomocí Nový klíčové slovo, můžeme tento paměťový prostor uvolnit pomocí vymazat klíčové slovo.

Syntax:

delete pointer_variable // Zde je pointer_variable ukazatel, který ukazuje na datový objekt vytvořený novým. delete [] pointer_variable // K uvolnění paměti dynamicky přiděleného pole, na kterou ukazuje ukazatel-proměnná, používáme následující formu mazání:

Příklad:

smazat ptr smazat [] ptr

Poznámka : Rozsah objektu nebo jeho životnost je čas, po který objekt zůstane v paměti během provádění programu. Přidělení paměti haldy je pomalejší než zásobník, protože v haldě neexistuje žádné konkrétní pořadí, ve kterém můžete přidělit paměť, zatímco v zásobníku následuje LIFO.

Pokračujeme tímto článkem o dynamickém přidělování paměti v C ++

Dynamicky přidělující pole

Hlavní využití konceptu dynamické alokace paměti je pro alokaci paměti matici, když ji musíme deklarovat zadáním její velikosti, ale nejsme si tím jisti.

Podívejme se na příklad, abychom pochopili jeho použití.

#include using namespace std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] // Dynamická alokace paměti cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (značky + i)} pro (int i = 0 i

Vysvětlení:
V tomto příkladu nejprve požádáme uživatele o počet studentů ve třídě a jeho hodnotu uložíme do proměnné len. Poté deklarujeme pole celého čísla a přidělíme mu místo v paměti dynamicky rovné hodnotě uložené v proměnné len pomocí tohoto příkazu int * marks = new int [length], takže je mu přidělen prostor rovný 'délce * (velikost 1 celé číslo)'. Zbytek kódu je samozřejmý.

Pokračujeme tímto článkem o dynamickém přidělování paměti v C ++

Dynamické přidělování paměti pro objekty

Můžeme také dynamicky alokovat objekty.

Jak víme, že Constructor speciální členská funkce třídy používaná k inicializaci objektu a Destructor je také členská funkce třídy, která se volá vždy, když objekt vyjde z rozsahu.

přidání dvou čísel v Javě

Destruktor lze použít k uvolnění paměti přiřazené objektu. Volá se za následujících podmínek.

  • Když místní objekt vyjde z rozsahu
  • Pro globální objekt, když je operátor použit na ukazatel na objekt třídy

Při dynamickém přidělování paměti objektům můžeme opět používat ukazatele.

Podívejme se na příklad řady objektů.

#include using namespace std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Výstup:

Vysvětlení:

Konstruktor bude volán třikrát, protože přidělujeme paměť třem objektům třídy Random. Destruktor bude také vyvolán třikrát během každého z těchto objektů. „Random * a = new Random [3]“ toto tvrzení odpovídá za dynamickou alokaci paměti našeho objektu.

Tak jsme dospěli ke konci tohoto článku o „Dynamické alokaci paměti C ++“. Pokud se chcete dozvědět více, podívejte se na Edureka, důvěryhodná online vzdělávací společnost. Výcvikový a certifikační kurz Edureka Java J2EE a SOA je navržen tak, aby vás vyškolil jak pro základní, tak pro pokročilé koncepty Java spolu s různými rámci Java jako Hibernate & Spring.

Máte na nás dotaz? Uveďte to prosím v sekci komentářů tohoto blogu a my se vám ozveme co nejdříve.