Czym jest sterta pamięci?

Co to jest sterta pamięci ?

 119
Author: H4cKL0rD, 2010-02-22

6 answers

Prawdopodobnie masz na myśli stertę z punktu widzenia alokacji pamięci, a nie z punktu widzenia struktury danych (termin ma wiele znaczeń).

Bardzo prostym wyjaśnieniem jest to, że sterta jest częścią pamięci, w której znajduje się dynamicznie przydzielana Pamięć (tzn. pamięć przydzielana przez malloc). Pamięć przydzielona ze sterty pozostanie przydzielona, dopóki nie wystąpi jedna z następujących sytuacji:

  1. pamięć to free'd
  2. program terminuje

Jeśli wszystkie odniesienia do przydzielonej pamięci zostaną utracone (np. nie przechowujesz już do niej wskaźnika), masz coś, co nazywa się wyciekiem pamięci . To jest miejsce, w którym pamięć została przydzielona, ale nie masz już łatwego dostępu do niej. Wyciekłej pamięci nie można odzyskać dla przyszłych alokacji pamięci, ale po zakończeniu programu pamięć zostanie zwolniona przez system operacyjny.

Kontrast z stosem pamięci, gdzie lokalna zmienne (zdefiniowane w metodzie) na żywo. Pamięć przydzielona na stos zwykle żyje tylko do czasu powrotu funkcji (są od tego wyjątki, np. statyczne zmienne lokalne).

Więcej informacji o stercie znajdziesz w w tym artykule .

 160
Author: LeopardSkinPillBoxHat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-02 17:14:29

A memory sterta jest miejscem w pamięci, w którym pamięć może być przydzielana przy losowym dostępie.
W przeciwieństwie do stos w przypadku gdy pamięć jest przydzielana i zwalniana w ściśle określonej kolejności, poszczególne elementy danych przydzielane na stercie są zazwyczaj uwalniane w sposób asynchroniczny od siebie. Każdy taki element danych jest zwalniany, gdy program wyraźnie zwolni odpowiedni wskaźnik, co może skutkować fragmentacją sterty. Tylko w opozycji dane na górze (lub na dole, w zależności od sposobu działania stosu) mogą zostać zwolnione, powodując zwolnienie elementu danych w odwrotnej kolejności, w jakiej zostały przydzielone.

 10
Author: mjv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-22 04:25:27

Sterta pamięci jest wspólną strukturą do przechowywania dynamicznie przydzielanej pamięci. Zobacz Dynamic_memory_allocation {[2] } na Wikipedii.

Istnieją inne struktury, takie jak baseny, stosy i stosy.

 6
Author: Justicle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 06:45:09

Jest to część pamięci przydzielona z systemu operacyjnego przez menedżera pamięci używanego przez proces. Wywołania do malloc() et alia następnie pobierają pamięć z tej sterty, zamiast mieć do czynienia bezpośrednio z systemem operacyjnym.

 5
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-22 04:18:34

Prawdopodobnie masz na myśli stertę pamięci, nie stertę pamięci.

Heap memory jest zasadniczo dużą pulą pamięci (zazwyczaj na proces), z której uruchomiony program może żądać fragmentów. Jest to zwykle nazywane dynamiczna alokacja .

Różni się od stosu, gdzie przydzielane są "zmienne automatyczne". Na przykład, gdy zdefiniujesz w funkcji C zmienną wskaźnika, na stosie przydzielana jest wystarczająca ilość miejsca do przechowywania adresu pamięci. Jednak często będziesz musiał dynamicznie przydzielaj miejsce (za pomocą malloc) na stercie, a następnie podaj adres, pod którym zaczyna się ten fragment pamięci do wskaźnika.

 5
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-22 04:21:26

Heap jest po prostu obszarem, w którym pamięć jest alokowana lub dealokowana bez żadnego porządku. Dzieje się tak, gdy tworzy się obiekt za pomocą operatora new lub czegoś podobnego. Jest to przeciwieństwo stosu, w którym pamięć jest dealokowana na zasadzie first in last out.

 4
Author: fastcodejava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-22 05:00:19