Dynamiczny alokacja pamięci w C ++

Dynamiczny alokacja pamięci w C ++

Przydział pamięci jest określany w momencie deklaracji zmiennej. Ale w większości przypadków nie wiemy, ile pamięci jest wymagane dla określonej zmiennej. W takim przypadku alokacja pamięci musi być wykonana w czasie wykonywania. Przydział pamięci środowiska wykonawczego programu jest znany jako dynamiczny alokacja pamięci. W dynamicznej alokacji pamięci nie znamy rzeczywistego rozmiaru zmiennej. Ręcznie przydzielamy pamięć dla tej zmiennej, a może być również tablicą lub przedmiotem klasy. Wskaźniki odgrywają kluczową rolę w dynamicznej alokacji pamięci. Kiedy dynamicznie przydzielamy pamięć, „nowy„Słowo kluczowe służy do poinformowania kompilatora, że ​​dynamicznie przydzielamy pamięć. Kiedy skończymy z przydzielaniem pamięci, w końcu musimy ręcznie ”usuwać„Ta zarezerwowana pamięć dynamiczna. W innych językach programowania, takich jak Python i Java, nie musimy dynamicznie alokować pamięci, ponieważ kompilator automatycznie to robi. Ale w C i C ++ robimy to ręcznie za pomocą nowy (aby zarezerwować przestrzeń) i usuwać (do wolnej przestrzeni) Słowa kluczowe.

Dlaczego dynamicznie alokują pamięć?

W C ++ alokacja pamięci dynamicznej odbywa się, gdy nie znamy rzeczywistego rozmiaru zmiennej lub elementów, które chcemy przechowywać w zmiennej. Całkowite wartości, które należy przechowywać, są rozstrzygane w czasie wykonywania. Sterta przydziela pamięć dynamiczną, ale w przypadku statycznym pamięć jest przypisywana w stosie. Kiedy więc nie znamy dokładnego rozmiaru zmiennych i musi to być wykonane w czasie wykonywania, przydzielić pamięć dynamicznie.

Składnia:

Rezerwowa pamięć
Pointer_variable = new Data_Type;

Najpierw musimy zarezerwować pamięć w stosie. W tym celu definiujemy zmienną typu wskaźnika równego „nowy”Słowo kluczowe, a następnie zdefiniuj typ zmiennej. „„nowy”Słowo kluczowe zastrzega pamięć w stercie.

Możemy również zdefiniować zmienną typu tablicy.

Pointer_varable = new Data_Type [rozmiar];

Aby zainicjować zmienną, po prostu umieszczamy wartość w nawiasie po danych data_type ():

Pointer_variable = nowy data_type (wartość);
Wolna pamięć
usuń wskaźnik_variable;

Kiedy skończymy z dynamiczną alokacją pamięci, podaj pamięć, aby zapisać dane z wycieku pamięci. „„usuwać”Słowo kluczowe z nazwą zmiennej wskaźnika uwalnia pamięć dynamiczną.

Dynamiczna alokacja pamięci zmiennej

Wyjaśnijmy proces alokacji i rozbieżności dynamicznej pamięci zmiennej typu liczb całkowitych.

Kod:

#włączać
za pomocą przestrzeni nazw Std;
int main ()
int* p_value = null;
p_value = new int;
*p_value = 674;
Cout<< "Value of p_valueis : " << *p_value<usuń p_value;
powrót 0;

Uruchom ten kod, włączając plik nagłówka, aby uzyskać dostęp do metod wejściowych i wyjściowych biblioteki. Ta biblioteka ma wbudowane metody, do których możemy uzyskać dostęp do naszego programu. Teraz wywołaj metodę main () i zdefiniuj zmienną wskaźnika „*P_Value”, aby utrzymać adres sterty, ponieważ dynamiczna alokacja pamięci jest wykonywana w sterce. Alokacja statyczna odbywa się w stosie, ponieważ wiemy już, że ilość danych oznacza rozmiar zmiennej. Zainicjuj wskaźnik liczb całkowitych za pomocą „Null”.

Następnie przydzień dynamiczną pamięć zmiennej „P_Value” wskaźnik za pomocą „nowego” słowa kluczowego i typu danych „int” zmiennej. Korzystając z terminu „nowy”, kompilator jest instruowany, aby przydzielić pamięć sterty dla zmiennej typu liczb całkowitych. Dodatkowo przechowuj wartość „674” w zmiennej typu wskaźnika „*P_Value”. Następnie uruchom polecenie „Cout”, aby wydrukować linię „Wartość P_Value” i wartość zmiennej liczby całkowitych „*P_Value”, która jest dynamicznie przechowywana w sterce. Aby pobrać dane zapisane w sterce, używamy wskaźnika. Wskaźnik przechowuje i uzyskuje dostęp do danych w stercie; Nie dostęp do danych. Następnie użyj polecenia „Usuń”, aby usunąć zmienną typu wskaźnika „P_Value”, aby nie stracić naszych danych lub żadna inna osoba nie mogła uzyskać dostępu do naszych danych.

Wyjście:

Wartość P_Value to: 674

Dynamiczna alokacja pamięci obiektu klasowego

Zdefiniujmy klasę i dynamicznie przydzielić pamięć do jej obiektów w tej ilustracji.

Kod:

#włączać
za pomocą przestrzeni nazw Std;
klasa program_0
publiczny:
Program_0 ()
Cout<< "I am Constructor" <
~ Program_0 ()
Cout<< "I am Destructor" <
;
int main ()
Program_0* myarray = nowy program_0 [3];
Usuń [] myarray;
powrót 0;

W tym kodzie zintegruj bibliotekę, aby użyć metody „cout”. Następnie użyj standardowej przestrzeni nazw. Zdefiniuj klasę „Program_0” i ustaw tę klasę jako publiczną. Metody klasy publicznej można uzyskać poza klasą. Pozostałe klasy mogą również uzyskać dostęp do metod tej klasy. Zdefiniuj konstruktor i destruktor w tej klasie. Zainicjujemy członków danych klasy w konstruktorze. Destruktor niszczy obiekty po wykonaniu programu. Uwalnia pamięć po wykonaniu zadania. Oba są zdefiniowane przez nazwę klasy.

W konstruktorze programu programu piszemy jeden wiersz kodu, aby wydrukować wiadomość na terminalu. Podobnie, w ~ programu programu () wyświetl wiadomość, uruchamiając instrukcję „cout”. Ilekroć tworzony obiekt klasowy jest wywoływany konstruktory i destruki. Kiedy nazywamy konkretną klasę, wykonuje konstruktor, a następnie wykonuje inne operacje, które przypisujemy do niej. Po zakończeniu procesu nazywany jest destruktor i niszczy wszystkie obiekty tworzone w celu uzyskania dostępu do metod klasowych i członków danych.

Ponadto uruchom funkcję main () tego kodu. Każda klasa jest wywoływana, a jej obiekty są tworzone w ramach tej metody. Utwórz wskaźnik „*MyArray” obiektu klasy „Program_0” i przydzielić do niego pamięć dynamiczną za pomocą „nowego” słowa kluczowego. Tutaj definiujemy rozmiar tablicy 3. Klasa nazywana jest trzykrotnie, a konstruktor również wykonuje trzykrotnie. Po tym wszystkim niszczyciel jest nazywany trzykrotnie, aby zwolnić przestrzeń. Destruktor usuwa obiekt, który trzykrotnie nazywa klasę.

Wyjście:

Jestem konstruktorem
Jestem konstruktorem
Jestem konstruktorem
Jestem niszczycielem
Jestem niszczycielem
Jestem niszczycielem

Wniosek

Ten dokument analizuje dynamiczny alokacja pamięci w C++. Obserwujemy również, dlaczego dynamicznie przydzielamy pamięć. Dynamiczna alokacja pamięci jest ważna, gdy nie znamy rzeczywistego rozmiaru danych, które należy przechowywać. W innych językach, takich jak Python, programiści nie muszą ręcznie alokować pamięci, ponieważ kompilator robi to automatycznie. Po przydzieleniu pamięci, przechowywaniu tam danych i zapewnieniu dostępu do nich pamięć jest rozdawana. Deallocation jest ważne, ponieważ jeśli nie przekazujemy pamięci, istnieje szansa na wyciek pamięci. Dynamiczny alokacja pamięci zmiennej liczb całkowitych i obiektu klasowego wyjaśniono w kodach tego przewodnika.