Когда процесс запрашивает память, а операционная система предоставляет некоторые новые страницы для процесса, ядро должно инициализировать страницы (например, нулями), чтобы избежать отображения потенциально уверенных данных, которые использовали другой процесс. То же самое, когда процесс запускается и получает некоторую память, например сегмент стека.
Когда я запускаю следующий код в Linux, результатом является то, что большая часть выделенной памяти действительно равна 0, но что-то около 3-4 кБ в нижней части стека (последние элементы массива, самые высокие адреса) содержит случайные числа.
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int * a = (int*)alloca(sizeof(int)*2000000);
for(int i = 0; i< 2000000; ++i)
cout << a[i] << endl;
return 0;
}
- Почему он тоже не установлен на ноль?
- Может быть, потому, что этот процесс повторно используется?
- Если да, может ли это быть код инициализации, который ранее использовал эти 3-4 кбайта памяти?