Sobes.tech
Middle

Τι είναι η βασική εγγύηση ασφαλείας στο πλαίσιο της τυπικής βιβλιοθήκης C++ και πώς επηρεάζει τη διαχείριση πόρων;

sobes.tech AI

Απάντηση από AI

Η βασική εγγύηση ασφαλείας (βασικό επίπεδο ασφαλείας εξαιρέσεων) σημαίνει ότι, σε περίπτωση εμφάνισης εξαίρεσης, το πρόγραμμα βρίσκεται σε μια σωστή, αν και όχι απαραίτητα προβλέψιμη, κατάσταση. Πόροι, όπως δυναμική μνήμη ή περιγραφείς αρχείων, που έχουν αποκτηθεί από τη λειτουργία πριν από την εμφάνιση της εξαίρεσης, θα απελευθερωθούν σωστά.

Αυτό επιτυγχάνεται μέσω της χρήσης του RAII (Resource Acquisition Is Initialization) — μια ιδιωματική πρακτική όπου η κατοχή ενός πόρου συνδέεται με τον κύκλο ζωής του αντικειμένου. Ο κατασκευαστής του αντικειμένου αποκτά τον πόρο, και ο καταστροφέας τον απελευθερώνει. Όταν η στοίβα ξεδιπλώνεται λόγω εξαίρεσης, οι καταστροφείς των αντικειμένων που δημιουργήθηκαν στο τρέχον μπλοκ καλούνται αυτόματα, διασφαλίζοντας την απελευθέρωση πόρων.

#include <vector>
#include <fstream>
#include <stdexcept>

void process_data(const std::string& filename) {
    std::vector<int> data; // Δείκτης (δυναμική μνήμη)
    std::ifstream file(filename); // Πόρος: αρχείο

    if (!file.is_open()) {
        throw std::runtime_error("Αδυναμία ανοίγματος αρχείου"); // Εξαίρεση - το αρχείο δεν ανοίγει
    }

    int value;
    while (file >> value) { // Ανάγνωση δεδομένων - μπορεί να ρίξει εξαίρεση
        data.push_back(value); // Μπορεί να ρίξει εξαίρεση σε περίπτωση έλλειψης μνήμης
    }

    // Αν η εξαίρεση ριχτεί πριν από αυτό το σημείο (π.χ. κατά το άνοιγμα αρχείου, ανάγνωση ή προσθήκη στο vector),
    // οι καταστροφείς του file (που κλείνει το αρχείο) και του data (που ελευθερώνει τη μνήμη) καλούνται αυτόματα,
    // διασφαλίζοντας την βασική εγγύηση ασφαλείας: το αρχείο είναι κλειστό, η μνήμη ελευθερώνεται,
    // αλλά η κατάσταση του data μπορεί να είναι απροσδιόριστη (μερικώς γεμάτο).

    // Περαιτέρω επεξεργασία του data...
    // ...
} // Οι καταστροφείς του file και του data καλούνται εδώ, αν η εξαίρεση δεν έχει ριχτεί

Με την βασική εγγύηση:

  • Όλοι οι invariants των κλάσεων μπορούν να παραβιαστούν.
  • Τα δεδομένα μπορούν να τροποποιηθούν μερικώς.
  • Οι πόροι δεν διαφεύγουν.

Αυτό είναι πιο αδύναμο από την ισχυρή εγγύηση (η κατάσταση του προγράμματος δεν αλλάζει σε περίπτωση εξαίρεσης) και δεν υπάρχει εγγύηση (η κατάσταση του προγράμματος είναι απροσδιόριστη, μπορεί να υπάρχουν διαρροές). Στη βιβλιοθήκη standard, πολλές λειτουργίες παρέχουν την βασική εγγύηση, που αποτελεί το ελάχιστο απαιτούμενο για σωστή εργασία με εξαιρέσεις.