O que é a garantia básica de segurança no contexto da biblioteca padrão C++ e como ela afeta a gestão de recursos?
sobes.tech IA
Resposta da IA
A garantia básica de segurança (segurança básica de exceção) significa que, em caso de exceção, o programa encontra-se num estado correto, embora não necessariamente previsível. Os recursos, como memória dinâmica ou descritores de ficheiros, que foram adquiridos pela função antes do aparecimento da exceção, serão libertados corretamente.
Isto é conseguido através do uso de RAII (Resource Acquisition Is Initialization), uma idiomática onde a posse de um recurso está associada ao ciclo de vida do objeto. O construtor do objeto adquire o recurso, e o destrutor libertá-lo. Quando a pilha é desenrolada devido a uma exceção, os destrutores dos objetos criados no bloco atual são chamados automaticamente, garantindo a libertação de recursos.
#include <vector>
#include <fstream>
#include <stdexcept>
void process_data(const std::string& filename) {
std::vector<int> data; // Vetor (memória dinâmica)
std::ifstream file(filename); // Recurso: ficheiro
if (!file.is_open()) {
throw std::runtime_error("Não é possível abrir o ficheiro"); // Exceção: não é possível abrir o ficheiro
}
int value;
while (file >> value) { // Leitura de dados - pode lançar uma exceção
data.push_back(value); // Pode lançar uma exceção por falta de memória
}
// Se uma exceção for lançada antes deste ponto (por exemplo, ao abrir o ficheiro, ler ou adicionar ao vetor),
// os destrutores de file (que fecha o ficheiro) e de data (que liberta a memória) serão chamados,
// garantindo a garantia básica de segurança: o ficheiro está fechado, a memória está libertada,
// mas o estado de data pode ser indefinido (parcialmente preenchido).
// Processamento adicional de data...
// ...
} // Os destrutores de file e data são chamados aqui se nenhuma exceção tiver sido lançada
Com a garantia básica:
- Todos os invariantes das classes podem ser violados.
- Os dados podem ser modificados parcialmente.
- Os recursos não vazam.
Isto é mais fraco do que a garantia forte (o estado do programa não muda em caso de exceção) e não há garantia (o estado do programa é indefinido, vazamentos podem ocorrer). Na biblioteca padrão, muitas operações oferecem a garantia básica, que é o requisito mínimo para trabalhar corretamente com exceções.