Очевидно, что Wikipedia содержит достаточное количество информации по этой теме, но я хотел убедиться, что понимаю. И из того, что я могу сказать, важно понимать отношение стека/кучи, чтобы действительно понять утечку памяти?
Итак, вот что я (думаю) понимаю. Исправления очень приветствуются!
При первом запуске программы выделяется блок памяти, скажем от 0x000 до 0xFFF. Первая часть (скажем от 0x000 до 0x011) - это сегмент кода/текста, где загружен программный код.
+--------------+ 0x011
| Program Code |
+--------------+ 0x000
Затем у вас есть стек (от 0x012 до 0x7ff), который содержит локальные переменные, и они сохраняются/извлекаются FIFO. Поэтому, если у вас есть что-то вроде
char middleLetter(string word){
int len = word.length();
return word[len/2];
}
int main(){
int cool_number;
char letter;
letter = middleLetter("Words");
...
Затем ваши переменные будут выделены в стеке, который будет выглядеть следующим образом:
+-------------+ 0x7ff
| |
| |
| |
| ... |
| len |
| letter |
| cool_number |
+-------------+ 0x012
Конечно, если вы где-то выделяли память (используя malloc
или new
), но никогда не освобождая ее, тогда ваша куча могла бы выглядеть так, и теперь у вас есть утечка памяти:
+-------------+ 0xfff
| |
| malloc(20) | 0xf64
| malloc(50) | 0xf32
| malloc(50) | 0xf00
| ... |
| |
+-------------+ 0x800
Это означает, что, хотя вы можете напрямую обращаться к 0xf32 с помощью арифметики указателя, OS/ваша программа думает, что ячейки памяти 0xf00-0xf46 уже приняты и больше не будут использовать эти места для хранения, пока ваша программа не будет закрыт и память освобождается. Но как насчет общей памяти? Википедия говорит, что он никогда не будет выпущен (пока ваш компьютер не будет перезапущен?). Откуда вы знаете, если он разделяет память?
Это довольно хорошее базовое понимание? Есть ли что-то, что мне не хватает/не так? Спасибо, что посмотрели!