Sobes.tech
Middle

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.