Aviso do compilador (nível 1) C4530
Manipulador de exceção C++ usado, mas a semântica de desenrolamento não está habilitada. Especificar /EHsc
O código usa tratamento de exceção C++, mas /EHsc não foi incluído nas opções do compilador.
Comentários
O compilador exige a opção /EHsc
para compilar código C++ que segue o padrão C++ para tratamento de exceções. A semântica de desenrolamento C++ padrão especifica que objetos e quadros de pilha construídos entre onde uma exceção é gerada e onde ela é capturada precisam ser destruídas, e os recursos deles recuperados. Esse processo é conhecido como desenrolamento da pilha.
A opção /EHsc
informa ao compilador para gerar código que chama os destruidores em objetos de armazenamento automático quando uma exceção passa pelo quadro de pilha delimitador. Objetos de armazenamento automático são objetos alocados na pilha, como variáveis locais. Ele é chamado de armazenamento automático porque é alocado automaticamente quando as funções são chamadas e liberado automaticamente quando retornam. Um quadro de pilha são os dados colocados na pilha quando uma função é chamada, juntamente com o armazenamento automático dela.
Quando uma exceção é gerada, ela pode percorrer vários quadros de pilha antes de ser capturada. Esses quadros de pilha precisam ser desfeitos à medida que a exceção passa por eles na ordem de chamada inversa. Os objetos de armazenamento automático em cada quadro de pilha precisam ser destruídos para recuperar os recursos deles de maneira limpa. Esse é o mesmo processo de destruição e recuperação que acontece automaticamente quando uma função retorna normalmente.
Quando a opção /EHsc
não está habilitada, os objetos de armazenamento automáticos nos quadros de pilha entre a função de lançamento e a função em que a exceção é capturada não são destruídos. Somente os objetos de armazenamento automático criados em um bloco try
ou catch
são destruídos, o que pode levar a vazamentos de recursos significativos e outros comportamentos inesperados.
Se nenhuma exceção puder ser lançada em seu executável, você poderá ignorar esse aviso com segurança. Alguns códigos podem exigir outras opções de tratamento de exceção. Para obter mais informações, confira /EH.
Exemplo
O seguinte exemplo gera o erro C4530:
// C4530.cpp
// compile with: /W1
int main() {
try{} catch(int*) {} // C4530
}
Compile o exemplo com /EHsc
para resolver o aviso.