Примеры решений в С++

Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.

Текущая статья посвящена c++: RAII, STL, умные указатели, потоки, filesystem и практики безопасного системного кода..

Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:

  1. Основы
  2. Система и сеть
  3. Данные и разметка
  4. Код и разработка
  5. Языки
  6. Искусственный интеллект
  7. Проект
  8. Инфраструктура и безопасность
  9. Спин-офф

Обязательно пройдитесь.

А теперь приступим к нашему предмету.

Теория и соседние материалы

Термины

Термин Назначение
RAII Ресурс захватывается в конструкторе, освобождается в деструкторе
STL Контейнеры и алгоритмы (vector, sort, …)
Move semantics Передача владения без лишних копий
std::unique_ptr Единоличное владение объектом в куче

1. RAII для файла

#include <cstdio>
#include <memory>

auto file = std::unique_ptr<FILE, decltype(&std::fclose)>(
    std::fopen("log.txt", "w"),
    &std::fclose
);
if (file) {
  std::fprintf(file.get "started\n");
}

2. STL: фильтрация vector

#include <algorithm>
#include <vector>

std::vector<int> v{1, 2, 3, 4, 5};
v.erase(
    std::remove_if(v.begin v.end [](int x) { return x % 2 == 0; }),
    v.end()
);

3. std::filesystem

#include <filesystem>
namespace fs = std::filesystem;

for (const auto& entry : fs::recursive_directory_iterator("logs")) {
  if (entry.is_regular_file() && entry.pathextension() == ".log") {
    // process
  }
}

4. Поток с атомарным флагом остановки

#include <atomic>
#include <thread>

std::atomic<bool> stop{false};

std::thread worker([&] {
  while (!stop.load(std::memory_order_acquire)) {
    // work
  }
});

stop.store(true, std::memory_order_release);
worker.join();

5. std::optional и ошибки

#include <optional>
#include <string>

std::optional<int> parsePort(const std::string& s) {
  try {
    int p = std::stoi(s);
    if (p > 0 && p <= 65535) return p;
  } catch (..) {}
  return std::nullopt;
}

Типичные ошибки

  • Сырые new/delete вместо умных указателей.
  • Data race без mutex или атомиков.
  • Итератор инвалидирован после push_back на vector.

Чек-лист

  • Сборка с предупреждениями как ошибками (-Wall -Wextra).
  • Sanitizers (ASan/TSan) на CI для критичного кода.
  • CMake с явным стандартом C++17/20.