new [] doesn ' t уменьшать доступную память до заполнения

Это на C ++ на 64-битной CentOS с использованием G ++ 4.1.2.

Мы пишем тестовое приложение, чтобы увеличить использование памяти в системе n Гигабайты. Идея состоит в том, что общая нагрузка системы отслеживается через SNMP и т. Д. Так что это всего лишь способ осуществления мониторинга.

Однако мы видели, что простое выполнение:

char* p = new char[1000000000];

не влияет на память, используемую как показано либо сверху, либо свободно -m

Выделение памяти становится «реальным» только после того, как память записывается в:

memcpy(p, 'a', 1000000000);   //shows an increase in mem usage of 1GB

Но мы должны писать во всю память, простая запись в первый элемент не показывает увеличения используемой памяти:

p[0] = 'a';    //does not show an increase of 1GB.

Это нормально, действительно ли память была выделена полностью? Я не уверен, что это инструменты, которые мы используем (top и free -m), отображающие неверные значения, или что-то умное происходит в компиляторе, во время выполнения и / или в ядре.

видно даже в отладочной сборке с отключенной оптимизацией.

Насколько я понимаю, новый [] выделяет память немедленно. Задерживает ли среда выполнения C ++ это фактическое выделение до тех пор, пока к нему не обратится. В этом случае можно отложить исключение нехватки памяти до тех пор, пока не будет осуществлено выделение памяти, пока к ней не будет осуществлен доступ?

Поскольку это не проблема для нас, было бы неплохо узнать, почему это так оно и есть!

Ура!

Изменить:

Я не хочу знать, как мы должны использовать векторы, это не OO / C ++ / текущий способ делать что-то и т.д. и т.д. Я просто хочу знать, почему это происходит, так, как есть, вместо того, чтобы предлагать альтернативные способы попробовать это.

13
задан Bhargav Rao 11 February 2019 в 02:45
поделиться