Современный C++ и альтернативы на C

RAII и автоматическое освобождение ресурсов в C++

В этом уроке вы сравните безопасное закрытие файла в C с приёмом RAII в C++, где ресурсы освобождаются автоматически.

Введение

RAII (Resource Acquisition Is Initialization) - это приём, который привязывает время жизни ресурса, например файла, области памяти или соединения, к времени жизни объекта. Когда объект уничтожается, ресурс освобождается автоматически, как бы ни был покинут блок, даже если возникло исключение.

Главное

  • Поймите, как это делается в C, прежде чем изучать абстракции C++.
  • Выражайте владение ресурсами через RAII и семантику значений (value semantics).
  • Используйте типобезопасные средства C++ вместо макросов и приведений типов.

Примеры кода на C и C++

C
Запустить →
main.c
#include <stdio.h>

int main(void) {
    int result = 1;
    FILE *file = fopen("scores.txt", "w");
    if (!file) goto cleanup;
    if (fputs("Ada 95\n", file) < 0) goto cleanup;
    result = 0;

cleanup:
    if (file) fclose(file);
    puts(result ? "failed" : "saved");
    return result;
}
Результат выполнения
saved
C++
Запустить →
main.cpp
#include <fstream>
#include <iostream>

int main() {
    std::ofstream file("scores.txt");
    if (!file) return 1;
    file << "Ada 95\n";
    std::cout << "saved\n";
}
Результат выполнения
saved

Сравнение C и C++

В C программа использует метку cleanup и инструкцию goto, чтобы все пути, и успешные, и с ошибкой, проходили через fclose, который закрывает файл. В C++ std::ofstream закрывает файл в своём деструкторе (destructor), когда переменная file выходит из области видимости. Управление ресурсами становится чище, и риск забыть их освободить снижается.

C

C использует соглашения об именах, обратные вызовы, макросы и struct с контекстом.

C++

C++ предлагает абстракции с чёткими границами, безопасные по типам и обычно без дополнительных затрат при выполнении.

Упражнения для практики

Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.

  • Сначала напишите механизм на C, а затем используйте аналогичную возможность C++.
  • Замените ручное освобождение ресурсов на RAII.
  • Проверьте, не вызывает ли эта возможность выделение памяти или вызовы виртуальных функций.

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи