Sdílet prostřednictvím


Upozornění kompilátoru (úroveň 1) C4530

Použitá obslužná rutina výjimky jazyka C++, ale sémantika odvíjení není povolená. Určení /EHsc

Kód používá zpracování výjimek jazyka C++, ale /EHsc nebyl zahrnut do možností kompilátoru.

Poznámky

Kompilátor vyžaduje /EHsc možnost sestavit kód jazyka C++, který se řídí standardem C++ pro zpracování výjimek. Standardní sémantika uvolnění C++ určuje, že objekty a rámce zásobníku vytvořené mezi místem, kde je vyvolána výjimka a kde je zachycen, musí být zničeny a jejich prostředky obnoveny. Tento proces se označuje jako odvíjení zásobníku.

Tato /EHsc možnost kompilátoru říká, aby vygeneroval kód, který volá destruktory u automatických objektů úložiště, když výjimka projde přes rámec zásobníku. Objekty automatického úložiště jsou objekty přidělené v zásobníku, například místní proměnné. Říká se tomu automatické úložiště, protože se automaticky přivolá, když se funkce volají, a automaticky se uvolní, jakmile se vrátí. Rám zásobníku je data umístěná v zásobníku při zavolání funkce spolu s automatickým úložištěm.

Když dojde k vyvolání výjimky, může před zachycením procházet několik snímků zásobníku. Tyto rámce zásobníku musí být unwound, protože výjimka prochází v obráceném pořadí volání. Automatické objekty úložiště v každém rámečku zásobníku musí být zničeny, aby se jejich prostředky obnovily čistě. Jedná se o stejný proces zničení a obnovení, který se automaticky provede, když se funkce vrátí normálně.

/EHsc Pokud tato možnost není povolená, automatické objekty úložiště v rámcích zásobníku mezi vyvoláním funkce a funkcí, ve které je zachycena výjimka, se nezničí. Zničí se pouze automatické objekty úložiště vytvořené v bloku try nebo bloku catch , což může vést k významnému úniku prostředků a dalšímu neočekávanému chování.

Pokud ve vašem spustitelném souboru nelze vyvolat žádné výjimky, můžete toto upozornění bezpečně ignorovat. Některé kódy můžou vyžadovat jiné možnosti zpracování výjimek. Další informace najdete v tématu /EH.

Příklad

Následující ukázka vygeneruje C4530:

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

Zkompilujte ukázku s /EHsc cílem vyřešit upozornění.