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