Sobes.tech
Junior — Middle

Que dificuldades podem surgir ao lançar exceções dentro do construtor de um objeto?

sobes.tech IA

Resposta da IA

Lançar exceções dentro do construtor de um objeto em C++ pode levar a várias complicações:

  • Inicialização parcial do objeto: se uma exceção for lançada no construtor, o objeto é considerado não criado e o seu destruidor não é chamado. No entanto, os membros já inicializados (por exemplo, campos que foram construídos com sucesso antes da exceção) serão destruídos corretamente, mas se recursos foram alocados manualmente no construtor, eles devem ser libertados cuidadosamente para evitar fugas.

  • Exceções na lista de inicialização: se uma exceção for lançada na lista de inicialização, os destrutores dos membros já inicializados são chamados automaticamente, mas o resto do construtor não é executado.

  • Tratamento de exceções ao criar objetos: o código que chama deve estar preparado para que o objeto não seja criado e deve tratar a exceção corretamente.

  • Problemas com herança: se a classe base lançar uma exceção no seu construtor, a classe derivada não será criada e o seu construtor não será executado.

Exemplo:

class MyClass {
    int* data;
public:
    MyClass() {
        data = new int[10];
        if (!data) {
            throw std::bad_alloc();
        }
        // Se lançar uma exceção aqui, data deve ser libertada
    }
    ~MyClass() {
        delete[] data;
    }
};

Para evitar fugas, é melhor usar smart pointers ou objetos RAII que gerenciam recursos automaticamente.