Wat is de basisveiligheidsgarantie in de context van de standaardbibliotheek van C++ en hoe beïnvloedt deze het resourcebeheer?
sobes.tech AI
Antwoord van AI
De basisveiligheidsgarantie (basis exception safety) betekent dat, bij het optreden van een uitzondering, het programma zich in een correcte, hoewel niet noodzakelijk voorspelbare, toestand bevindt. Resources zoals dynamisch geheugen of bestandsdescriptoren die door de functie vóór het optreden van de uitzondering zijn verworven, worden correct vrijgegeven.
Dit wordt bereikt door gebruik te maken van RAII (Resource Acquisition Is Initialization), een idiom waarbij het bezit van een resource wordt gekoppeld aan de levenscyclus van het object. De constructor van het object verworven de resource, en de destructor geeft deze vrij. Wanneer de stack wordt afgewikkeld vanwege een uitzondering, worden de destructors van de in de huidige blok gemaakte objecten automatisch aangeroepen, wat het vrijgeven van resources garandeert.
#include <vector>
#include <fstream>
#include <stdexcept>
void process_data(const std::string& filename) {
std::vector<int> data; // Vector (dynamisch geheugen)
std::ifstream file(filename); // Resource: bestand
if (!file.is_open()) {
throw std::runtime_error("Kan bestand niet openen"); // Uitzondering - bestand wordt niet geopend
}
int value;
while (file >> value) { // Gegevens lezen - kan een uitzondering veroorzaken
data.push_back(value); // Kan een uitzondering veroorzaken bij geheugen tekort
}
// Als een uitzondering wordt geworpen vóór dit punt (bijvoorbeeld bij het openen van het bestand, lezen of toevoegen aan de vector),
// worden de destructors van file (sluit het bestand) en data (vrijgeeft het geheugen) automatisch aangeroepen,
// wat de basisveiligheidsgarantie garandeert: het bestand is gesloten, het geheugen is vrijgegeven,
// maar de toestand van data kan ongedefinieerd zijn (gedeeltelijk gevuld).
// Verdere verwerking van data...
// ...
} // De destructors van file en data worden hier aangeroepen, indien geen uitzondering is geworpen
Met de basisveiligheidsgarantie:
- Alle invarianten van klassen kunnen worden geschonden.
- Gegevens kunnen gedeeltelijk worden gewijzigd.
- Resources lekken niet.
Dit is zwakker dan de sterke garantie (de toestand van het programma verandert niet bij een uitzondering) en er is geen garantie (de toestand van het programma is ongedefinieerd, leaks kunnen optreden). In de standaardbibliotheek bieden veel operaties de basisveiligheidsgarantie, wat de minimale vereiste is voor correct werken met uitzonderingen.