Я думаю, что компилятор выполняет некоторую оптимизацию и на самом деле не выделяет память.Я запускал приведенные выше примеры (используя valgrind) несколько раз и видел, что, хотя там, где выделения, все где 0 байтов памяти.
Попробуйте это, и ваша программа будет убита (по крайней мере, в Unix):
#include <cstdio>
int main() {
int *p;
while (true) {
p = new int[1024*1024];
p[0] = 0;
printf("%p\n",p);
for(unsigned j = 1; j < 1024*1024; j++) {
p[j] = p[j-1] + 1;
}
}
return 0;
}
Вы видите, что единственное отличие состоит в том, что я использую выделенную память.
Таким образом, это на самом деле не дает сбоя, потому что я предполагаю, что ОС предотвращает сбой процесса, просто убивая егоНе уверен на 100% в этом)