RAII и автоматическое освобождение ресурсов в C++
В этом уроке вы сравните безопасное закрытие файла в C с приёмом RAII в C++, где ресурсы освобождаются автоматически.
Введение
RAII (Resource Acquisition Is Initialization) - это приём, который привязывает время жизни ресурса, например файла, области памяти или соединения, к времени жизни объекта. Когда объект уничтожается, ресурс освобождается автоматически, как бы ни был покинут блок, даже если возникло исключение.
Главное
- Поймите, как это делается в C, прежде чем изучать абстракции C++.
- Выражайте владение ресурсами через RAII и семантику значений (value semantics).
- Используйте типобезопасные средства C++ вместо макросов и приведений типов.
Примеры кода на C и 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
#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 использует соглашения об именах, обратные вызовы, макросы и struct с контекстом.
C++ предлагает абстракции с чёткими границами, безопасные по типам и обычно без дополнительных затрат при выполнении.
Упражнения для практики
Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.
- Сначала напишите механизм на C, а затем используйте аналогичную возможность C++.
- Замените ручное освобождение ресурсов на RAII.
- Проверьте, не вызывает ли эта возможность выделение памяти или вызовы виртуальных функций.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
Все задачи