C++ разработчик
80 задач. Условие и варианты ответа открыты всем; проверка, подсказка и разбор — в клубе.
Память и RAII
- Ранний выход из функции при ручном new/delete
- delete вместо delete[] для массива
- Присваивание одного unique_ptr другому
- Два объекта держат shared_ptr друг на друга
- delete через указатель на базовый класс
- Обращение к строке после std::move
- Класс с сырым указателем скопировали по значению
- string_view, возвращённый из функции
STL и контейнеры
- operator[] у std::map при чтении отсутствующего ключа
- Размер вектора после reserve
- Порядок обхода unordered_map
- Компаратор с нестрогим сравнением в std::sort
- Размер вектора после std::remove
- Удаление элементов из map внутри цикла
- Указатель на элемент растущего вектора
- Обход списка медленнее обхода вектора при равной сложности
Многопоточность и синхронизация
- Два потока инкрементируют общий счётчик
- Исключение внутри критической секции
- std::thread уничтожен без join и detach
- condition_variable без предиката
- atomic и составная операция check-then-act
- Два мьютекса, захватываемые в разном порядке
- Счётчики потоков в соседних ячейках массива
- Что именно потокобезопасно в shared_ptr
Сборка, тесты и профилирование
Современный C++: move-семантика, шаблоны, лямбды
- Буфер на 10 нулей оказался вектором из двух элементов
- Изменение конфига через auto не доходит до реестра
- Отложенный повтор запроса отправляет мусор вместо тела
- Цикл по словарю пользователей тормозит и не сохраняет изменения
- Code review требует убрать std::move из return
- Перемещение строки в сеттере всё равно копирует данные
- При росте вектора сообщения копируются, хотя move-конструктор есть
- Обёртка над обработчиком всегда вызывает копирующую перегрузку
- Поиск пользователя «работает» в тестах, а в проде отдаёт мусор
- Ревьюер назвал emplace_back(new Widget) утечкой при нехватке памяти
- Список из unique_ptr в фигурных скобках не компилируется
- Параллельная обработка файлов через std::async идёт строго по очереди
Сети в Linux: сокеты, epoll и Boost.Asio
- Под нагрузкой сервер получает два JSON-сообщения склеенными
- Сервер молча завершается с кодом 141, когда клиент рвёт соединение
- Второй клиент подключается, но ответ получает только после первого
- Задачи, отправленные в io_context, никогда не выполняются
- Каждый маленький запрос к сервису занимает ровно около 40 мс
- С EPOLLET часть соединений зависает с непрочитанными данными
- После запуска io_context в четырёх потоках буфер сессии портится
- Один медленный запрос в базу подвешивает всех клиентов Asio-сервера
- Сервер падает, когда клиент отключается во время чтения
- Клиенты WebSocket-сервера изредка получают перемешанные сообщения
- Сервер телеметрии упёрся в лимит дескрипторов из-за мёртвых соединений
- UDP-приёмник телеметрии теряет хвосты пакетов без ошибок
ООП, исключения и дизайн классов
- Все фигуры в векторе считают площадь как базовый класс
- Переопределённый обработчик событий ни разу не вызывается
- В логе ошибок вместо причины сбоя написано просто std::exception
- Вызов write(42) неожиданно компилируется и пишет пустой буфер
- Базовый класс вызывает виртуальную настройку, а срабатывает не та версия
- После переопределения одной перегрузки log(string) перестал компилироваться
- При переполнении диска сервис падает с terminate called after throwing
- Retina-рендерер рисует иконки в масштабе 1 вместо 2
- Добавили пустой деструктор для логирования, и вектор кадров стал копироваться
- После неудачного присваивания объект матрицы указывает на освобождённую память
- После смены порядка файлов в CMake сервис падает ещё до main
- Новое приватное поле в классе SDK сломало собранные клиентами плагины
Производительность и низкие задержки
- Расчёт суммы корзины на каждый запрос копирует 50 тысяч заказов
- Выгрузка 5 миллионов строк в CSV занимает минуты
- Удаление дубликатов из 100 тысяч идентификаторов работает полминуты
- При заполнении вектора на 20 миллионов точек память скачет и всё тормозит
- В профиле торгового движка лидируют атомарные инкременты shared_ptr
- Справочник на 300 элементов в std::map стал узким местом горячего цикла
- Парсер логов замедлился в 20 раз на файле с битыми строками
- Один и тот же фильтр втрое быстрее на отсортированных данных
- Треть времени обработчика сообщений уходит на malloc и free
- Сортировка с компаратором через std::function вдвое медленнее
- perf report показывает 38% в memmove, но непонятно, кто его вызывает
- p99 задержки подскакивает до 80 мс, хотя медиана — 0,3 мс
