Dynamiczna alokacja pamięci W C ++ to bardzo ważna funkcja, która pozwala rozważyć wymagania dotyczące zapotrzebowania na zasoby czasu rzeczywistego. W tym artykule będziemy badać Eksploracja w szczegółach. Następujące wskaźniki zostaną omówione w tym artykule,
- Potrzebujesz dynamicznej alokacji pamięci?
- Alokacja pamięci przy użyciu Nowy Słowo kluczowe
- Zwolnienie pamięci przy użyciu usunąć Słowo kluczowe
- Dynamiczne przydzielanie tablic
- Dynamiczne przydzielanie pamięci dla obiektów
Zacznijmy więc od tego artykułu o dynamicznej alokacji pamięci w C ++
Potrzebujesz dynamicznej alokacji pamięci?
Powiedzmy, że chcemy wprowadzić zdanie jako tablicę znaków, ale nie jesteśmy pewni dokładnej liczby znaków wymaganych w tablicy.
Teraz, podczas deklarowania tablicy znaków, jeśli określimy jej rozmiar mniejszy niż rozmiar żądanego ciągu, to otrzymamy błąd, ponieważ miejsce w pamięci przydzielonej tablicy jest mniejsze w porównaniu do rozmiaru ciągu wejściowego. Jeśli określimy jego rozmiar większy niż rozmiar ciągu wejściowego, wówczas tablicy zostanie przydzielone miejsce w pamięci, które jest znacznie większe niż rozmiar żądanego ciągu, co niepotrzebnie zużywa więcej pamięci, nawet gdy nie jest to wymagane.
W powyższym przypadku nie mamy pojęcia o dokładnym rozmiarze tablicy do czasu kompilacji (kiedy komputer kompiluje kod, a ciąg jest wprowadzany przez użytkownika). W takich przypadkach używamy rozszerzenia Nowy operator.
C ++ definiuje dwa jednoargumentowe operatory Nowy i usunąć które wykonują zadanie przydzielania i zwalniania pamięci w czasie wykonywania. Ponieważ te operatory (nowy i usuń) działają na wolnej pamięci magazynu (pamięci sterty), są również nazywane operatorem wolnego magazynu. Wskaźniki zapewniają niezbędne wsparcie dla systemu dynamicznej alokacji pamięci w C ++.
Przy pomocy dynamicznej alokacji program może uzyskać pamięć podczas działania.
jaki jest najlepszy java ide
Zmienne globalne i lokalne są przydzielane do pamięci podczas kompilacji. Nie możemy jednak dodawać żadnych zmiennych globalnych ani lokalnych w czasie wykonywania. Jeśli program musi używać zmiennej ilości pamięci, musielibyśmy alokować pamięć w czasie wykonywania, w razie potrzeby. I oczywiście tutaj procedury alokacji dynamicznej mogą służyć temu celowi.
Różnice między statyczną alokacją pamięci a dynamiczną alokacją pamięci:
Oto podstawowa architektura pamięci używana dla dowolnego programu w C ++:
Będziemy potrzebować takiego obrazu
Stos jest używany do statycznej alokacji pamięci, a sterta do dynamicznej alokacji pamięci, oba są przechowywane w pamięci RAM komputera.
Zmienne, które są przydzielane na stosie, podczas gdy statyczna alokacja pamięci jest przechowywana bezpośrednio w pamięci, a dostęp do tej pamięci jest bardzo szybki, również jej alokacja jest wykonywana podczas kompilacji programu. Gdy funkcja lub metoda wywołuje inną funkcję, która z kolei może wywołać inną funkcję itd., Wykonywanie wszystkich tych funkcji pozostaje zawieszone do momentu, gdy ostatnia funkcja zwróci jej wartość. Stos jest zawsze przechowywany w kolejności LIFO (ostatni w pierwszym wyszedł), ostatnio zarezerwowany blok jest zawsze następnym blokiem do zwolnienia. Pomaga to śledzić stos, a uwolnienie bloku ze stosu to nic innego jak dostosowanie jednego wskaźnika.
Pamięć dla zmiennych alokowanych na stercie jest przydzielana w czasie wykonywania podczas dynamicznej alokacji pamięci. Dostęp do tej pamięci jest nieco wolniejszy w porównaniu do stosu, ale rozmiar sterty jest ograniczony tylko wielkością pamięci wirtualnej. Element sterty nie ma żadnych zależności między sobą i zawsze można uzyskać do niego losowy dostęp w dowolnym momencie. W każdej chwili możemy przydzielić blok i zwolnić go w dowolnym momencie. Utrudnia to śledzenie, które części sterty są przydzielane lub zwalniane w danym momencie.
Przechodząc do tego artykułu na temat dynamicznego przydzielania pamięci w języku C ++
Alokacja pamięci przy użyciu Nowy Słowo kluczowe
W C ++ plik Nowy Operator służy do przydzielania pamięci w czasie wykonywania, a pamięć jest przydzielana w bajtach. Plik Nowy operator oznacza żądanie dynamicznej alokacji pamięci na stercie. Jeśli dostępna jest wystarczająca ilość pamięci, plik Nowy operator inicjuje pamięć i zwraca adres nowo przydzielonej i zainicjowanej pamięci do zmiennej wskaźnikowej.
Składnia:
typ danych * pointer_name = nowy typ danych
Przykład:
int * ptr = new int // Możemy zadeklarować zmienną podczas alokacji dynamicznej na dwa następujące sposoby. int * ptr = new int (10) int * ptr = new int {15} // operator new jest również używany do alokowania bloku (tablicy) pamięci typu data-type. int * ptr = new int [20] // Powyższa instrukcja dynamicznie alokuje pamięć na 20 liczb całkowitych typu int i zwraca wskaźnik do pierwszego elementu sekwencji na wskaźnik „ptr”.
Uwaga : Jeśli sterta nie ma wystarczającej ilości pamięci do alokacji, nowe żądanie wskazuje niepowodzenie, zgłaszając wyjątek std :: bad_alloc, chyba że z operatorem new użyto „nothrow”, w którym to przypadku zwraca wskaźnik NULL. Dlatego dobrą praktyką jest sprawdzenie zmiennej wskaźnika utworzonej przez new przed użyciem jej w programie.
Przechodząc do tego artykułu na temat dynamicznego przydzielania pamięci w języku C ++
Zwolnienie pamięci przy użyciu usunąć Słowo kluczowe:
Po przydzieleniu pamięci sterty do zmiennej lub obiektu klasy przy użyciu Nowy słowo kluczowe, możemy zwolnić to miejsce w pamięci za pomocą usunąć słowo kluczowe.
Składnia:
delete pointer_variable // Tutaj pointer_variable jest wskaźnikiem, który wskazuje na obiekt danych utworzony przez new. delete [] pointer_variable // Aby zwolnić dynamicznie alokowaną pamięć tablicową wskazywaną przez zmienną wskaźnika, używamy następującej formy usuwania:
Przykład:
usuń ptr usuń [] ptr
Uwaga : Zasięg obiektu lub czas życia obiektu to czas, przez który obiekt pozostaje w pamięci podczas wykonywania programu. Alokacja pamięci sterty jest wolniejsza niż w stosie, ponieważ w stercie nie ma określonej kolejności, w której można alokować pamięć, podczas gdy w stosie następuje to zgodnie z LIFO.
Przechodząc do tego artykułu na temat dynamicznego przydzielania pamięci w języku C ++
Dynamiczne przydzielanie tablic
Głównym zastosowaniem koncepcji dynamicznej alokacji pamięci jest przydzielanie pamięci do tablicy, gdy musimy ją zadeklarować, określając jej rozmiar, ale nie jesteśmy co do tego pewni.
Zobaczmy przykład, aby zrozumieć jego użycie.
#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] // Dynamiczna alokacja pamięci cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (znaki + i)} for (int i = 0 iWyjaśnienie:
W tym przykładzie najpierw pytamy użytkownika o liczbę uczniów w klasie i przechowujemy jej wartość w zmiennej len. Następnie deklarujemy tablicę liczb całkowitych i przydzielamy jej przestrzeń w pamięci dynamicznie równą wartości przechowywanej w zmiennej len za pomocą tej instrukcji int * marks = new int [length] w ten sposób przydzielana jest przestrzeń równa 'length * (rozmiar 1 liczba całkowita)'. Pozostała część kodu nie wymaga wyjaśnień.Przechodząc do tego artykułu na temat dynamicznego przydzielania pamięci w języku C ++
Dynamiczne przydzielanie pamięci dla obiektów
Możemy również dynamicznie alokować obiekty.
Jak wiemy, Konstruktor jest specjalną funkcją składową klasy używaną do inicjowania obiektu, a Destructor jest również funkcją składową klasy, która jest wywoływana, gdy obiekt wyjdzie poza zakres.
Destructor służy do zwalniania pamięci przypisanej do obiektu. Jest wywoływany w następujących warunkach.
- Gdy lokalny obiekt wychodzi poza zakres
- W przypadku obiektu globalnego, gdy operator jest stosowany do wskaźnika do obiektu klasy
Możemy ponownie używać wskaźników podczas dynamicznego przydzielania pamięci do obiektów.
Zobaczmy przykład tablicy obiektów.
#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 }Wynik:
Wyjaśnienie:
Konstruktor zostanie wywołany trzykrotnie, ponieważ przydzielamy pamięć trzem obiektom klasy Random. Destructor zostanie również wezwany trzykrotnie podczas każdego z tych obiektów. „Random * a = new Random [3]” ta instrukcja jest odpowiedzialna za dynamiczną alokację pamięci naszego obiektu.
W ten sposób doszliśmy do końca artykułu o „Dynamic Memory Allocation C ++”. Jeśli chcesz dowiedzieć się więcej, zapoznaj się z autorstwa Edureka, zaufanej firmy zajmującej się edukacją online. Szkolenie i certyfikacja J2EE i SOA firmy Edureka ma na celu przeszkolenie zarówno podstawowych, jak i zaawansowanych koncepcji języka Java, a także różnych struktur Java, takich jak Hibernate i Spring.
Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy na tym blogu, a skontaktujemy się z Tobą tak szybko, jak to możliwe.
samouczki Android Studio dla początkujących