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

RAII и детерминированная очистка

RAII очищает ресурс при любом выходе из scope, включая exception.

Что такое RAII и детерминированная очистка?

RAII очищает ресурс при любом выходе из scope, включая exception.

Свяжите lifetime ресурса с объектом.

Важные моменты

  • Сначала поймите механизм на C.
  • Используйте RAII и value semantics для ownership.
  • Предпочитайте type-safe абстракции макросам и cast.

Примеры кода на 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 label, чтобы всегда вызвать fclose; destructor fstream закрывает автоматически и локализует ownership.

C

C использует префиксы, callbacks, макросы и context-структуры.

C++

Язык предоставляет scoped и type-safe абстракции.

Практические задания

Запустите обе версии и изменяйте их, сравнивая гарантии языков.

  • Сначала напишите механизм на C.
  • Замените ручную очистку на RAII.
  • Измерьте allocation и virtual dispatch.