Примеры решений в С++
Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.
Текущая статья посвящена c++: RAII, STL, умные указатели, потоки, filesystem и практики безопасного системного кода..
Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:
- Основы
- Система и сеть
- Данные и разметка
- Код и разработка
- Языки
- Искусственный интеллект
- Проект
- Инфраструктура и безопасность
- Спин-офф
Обязательно пройдитесь.
А теперь приступим к нашему предмету.
Теория и соседние материалы
Термины
| Термин | Назначение |
|---|---|
| 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.