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í.