Я сделал небольшую модификацию вашего кода:
#include <array>
template <size_t size>
class Overflow
{
private:
Overflow* overflow;
std::array<int,size> x;
public:
Overflow()
{
overflow = new Overflow();
}
};
Вкл. wandbox это
int main()
{
Overflow<1> overflow_happens;
}
приводит к ошибке сегментации, вызванной переполнением стека.
Однако это
int main()
{
Overflow<10000> bad_alloc;
}
результат в
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
У вас здесь два конкурирующих эффекта. В первом приближении (подробности немного сложнее) вы используете для каждой рекурсии констурктора:
- a
Overflow*
в стеке
- целый
Overflow
экземпляр в куче
Следовательно, если вы сначала получите переполнение стека или bad_alloc
, зависит от размера Overflow
. А для небольших размеров вы сначала получите переполнение, потому что пространство стека намного более ограничено, чем пространство кучи.
PS: Я пропустил ваше редактирование ... если вы поместите new Overflow[100000]
в конструктор в своем коде, вы увеличите требуемое пространство кучи, как я сделал, добавив элемент array
. В стеке у вас все еще есть один указатель, и поэтому у вас заканчивается куча гораздо раньше.