Пример переполнения стека на C++ | OTUS
⚡ Открываем подписку на курсы!
Проходите параллельно 3 онлайн-курса в месяц по цене одного.
Подробнее

Курсы

Программирование
Flutter Mobile Developer Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Web-разработчик на Python
-11%
Архитектура и шаблоны проектирования
-14%
JavaScript Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах»
-18%
iOS-разработчик. Базовый курс
-23%
Разработчик на Spring Framework
-23%
Python Developer. Basic
-16%
C# ASP.NET Core разработчик
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
JavaScript Developer. Professional
-9%
Android Developer. Basic
-10%
Java Developer. Professional Разработчик C# AWS для разработчиков Highload Architect Reverse-Engineering. Professional CI/CD Vue.js разработчик Agile Project Manager Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Advanced Fullstack JavaScript developer
Инфраструктура
PostgreSQL
-10%
IoT-разработчик
-12%
Administrator Linux. Professional
-11%
Базы данных
-19%
Administrator Linux.Basic
-18%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
Супер-интенсив "SQL для анализа данных"
-16%
Software Architect
-12%
Сетевой инженер AWS для разработчиков Highload Architect Разработчик голосовых ассистентов и чат-ботов Внедрение и работа в DevSecOps Администратор Linux. Виртуализация и кластеризация Нереляционные базы данных Супер-практикум по использованию и настройке GIT
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Пример переполнения стека на C++

Cplus_Deep_21.1-5020-7b5678.png

Представьте, что у вас есть кусочек кода следующего содержания:

operator int() const {
    return *this;
}

Всё бы ничего, но тут имеется некоторая проблема. Что не так, спросите вы? Чтобы ответить на этот вопрос, посмотрим на полный код:

class Foo {
public:
    operator int() const {
        return *this;
    }
};

int main() {
    Foo foo;
    int i = foo;
    return 0;
}

Этот код без проблем скомпилируется, хотя ряд компиляторов может сказать warning. Но когда вы этот код запустите, вы столкнётесь с переполнением стека, словив stack overflow.

В чём же дело?

Оказывается, что в нашем коде operator int старается привести возвращаемое значение к типу int. И это можно сделать, ведь для текущего объекта мы имеем прекрасный operator int, который, собственно говоря, это и делает.

Таким образом, функция вызывает сама себя и продолжает это делать рекурсивно, то есть до тех пор, пока стек не переполнится.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться