HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: c++, stack overflow, переполнение стека</p>
1 <p>Теги: c++, stack overflow, переполнение стека</p>
2 <p>Представьте, что у вас есть кусочек кода следующего содержания:</p>
2 <p>Представьте, что у вас есть кусочек кода следующего содержания:</p>
3 operator int() const { return *this; }<p>Всё бы ничего, но тут имеется некоторая проблема. Что не так, спросите вы? Чтобы ответить на этот вопрос, посмотрим на полный код:</p>
3 operator int() const { return *this; }<p>Всё бы ничего, но тут имеется некоторая проблема. Что не так, спросите вы? Чтобы ответить на этот вопрос, посмотрим на полный код:</p>
4 class Foo { public: operator int() const { return *this; } }; int main() { Foo foo; int i = foo; return 0; }<p>Этот код без проблем скомпилируется, хотя ряд компиляторов может сказать warning. Но когда вы этот код запустите, вы столкнётесь с переполнением стека, словив<strong>stack overflow</strong>.</p>
4 class Foo { public: operator int() const { return *this; } }; int main() { Foo foo; int i = foo; return 0; }<p>Этот код без проблем скомпилируется, хотя ряд компиляторов может сказать warning. Но когда вы этот код запустите, вы столкнётесь с переполнением стека, словив<strong>stack overflow</strong>.</p>
5 <h2>В чём же дело?</h2>
5 <h2>В чём же дело?</h2>
6 <p>Оказывается, что в нашем коде operator int старается привести возвращаемое значение к типу int. И это можно сделать, ведь для текущего объекта мы имеем прекрасный operator int, который, собственно говоря, это и делает.</p>
6 <p>Оказывается, что в нашем коде operator int старается привести возвращаемое значение к типу int. И это можно сделать, ведь для текущего объекта мы имеем прекрасный operator int, который, собственно говоря, это и делает.</p>
7 <p>Таким образом,<strong>функция вызывает сама себя и продолжает это делать рекурсивно</strong>, то есть до тех пор, пока стек не переполнится.</p>
7 <p>Таким образом,<strong>функция вызывает сама себя и продолжает это делать рекурсивно</strong>, то есть до тех пор, пока стек не переполнится.</p>
8  
8