У меня есть две простые программы на C++ и два вопроса. Я работаю в CentOS 5.2, и моя среда разработки выглядит следующим образом:
- g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50)
- Вывод "ulimit -s": 10240 (кбайт), то есть 10 МБ.
Программа №1:
основной.cpp:
int main(int argc, char * argv[])
{
char buf[1024*1024*11] = {0};
return 0;
}
(Составлено с помощью "g++ -g main.cpp")
Программа выделяет 1024*1024*11 байт (то есть 11 МБ) в стеке, но не падает. После того, как я изменил размер выделения на 1024*1024*12 (то есть 12 МБ), программа вылетает. Я думаю, что это должно быть вызвано переполнением стека. Но почему программа не аварийно завершает работу, когда размер выделения составляет 11 МБ, что также превышает верхний предел в 10 МБ??
Программа №2:
основной.cpp:
#include <iostream>
int main(int argc, char * argv[])
{
char buf[1024*1024*11] = {0};
std::cout << "*** separation ***" << std::endl;
char buf2[1024*1024] = {0};
return 0;
}
(Составлено с помощью "g++ -g main.cpp")
Эта программа приведет к сбою программы, поскольку она выделяет 12 МБ байтов в стеке. Однако, согласно файлу дампа ядра (см. ниже), сбой происходит на buf, а не на buf2. Разве не должен произойти сбой с buf2, потому что из программы №1 мы знаем, что выделение char buf[1024*1024*11] в порядке, поэтому после того, как мы выделим еще 1024*1024 байт, стек переполнится?
Я думаю, что должны быть некоторые довольно фундаментальные концепции, которые я не смог четко понять. Но какие они??
Приложение: Информация о дампе ядра, сгенерированная программой №2:
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
[New process 16433]
#0 0x08048715 in main () at main.cpp:5
5 char buf[1024*1024*11] = {0};