Compartir a través de


Advertencia del compilador (nivel 1) C4530

Controlador de excepciones de C++ utilizado, pero no está habilitada la semántica de desenredo. Especifique /EHsc

El código usa el control de excepciones de C++, pero /EHsc no se incluyó en las opciones del compilador.

Comentarios

El compilador requiere la opción /EHsc para compilar código de C++ que cumpla con el estándar de C++ para el control de excepciones. La semántica de desenredado estándar de C++ especifica que los objetos y marcos de pila construidos entre donde se genera una excepción y donde se detectan deben destruirse y se deben recuperar sus recursos. Este proceso se conoce como desenredado de la pila.

La opción /EHsc indica al compilador que genere código que llame a los destructores en objetos de almacenamiento automático cuando una excepción pase por el marco de pila contenedor. Los objetos de almacenamiento automático son objetos asignados en la pila, como variables locales. Se denomina almacenamiento automático porque se asigna automáticamente cuando se llama a las funciones y se libera de manera automática cuando se devuelven. Un marco de pila son los datos colocados en la pila cuando se llama a una función, junto con su almacenamiento automático.

Cuando se genera una excepción, puede desplazarse por varios marcos de pila antes de que se detecte. Estos marcos de pila se deben desenredar a medida que la excepción pasa a través de ellos en orden de llamada inverso. Los objetos de almacenamiento automático de cada marco de pila se deben destruir para recuperar sus recursos de manera limpia. Es el mismo proceso de destrucción y recuperación que se produce automáticamente cuando una función se devuelve de manera normal.

Cuando la opción /EHsc no está habilitada, los objetos de almacenamiento automático de los marcos de pila entre la función de generación y la función donde se detecta la excepción no se destruyen. Solo se destruyen los objetos de almacenamiento automático creados en un bloque try o catch, lo que puede provocar fugas de recursos significativas y otro tipo de comportamiento inesperado.

Si no se puede generar ninguna excepción en el archivo ejecutable, puede omitir esta advertencia de manera segura. Es posible que cierto código requiera otras opciones de control de excepciones. Para más información, consulte /EH.

Ejemplo

El ejemplo siguiente genera la advertencia C4530:

// C4530.cpp
// compile with: /W1
int main() {
   try{} catch(int*) {}   // C4530
}

Compile el ejemplo con /EHsc para resolver la advertencia.