在linux/gcc的C++中使用longjmp和setjmp關於以下方面是否安全?C++:安全使用longjmp和setjmp?
- 異常處理(我不使用的longjmp/setjmp的執行異常處理。我想知道有什麼副作用的longjmp/setjmp的會對標準異常處理)
*this
指針- 信號
- 智能指針(提升的共享和侵入指針)
- 任何其他你可以想到的。
在linux/gcc的C++中使用longjmp和setjmp關於以下方面是否安全?C++:安全使用longjmp和setjmp?
*this
指針我只知道這些命令,並沒有看到他們在實際應用中的行動。
恕我直言,可以肯定地說使用它們並不安全:開發人員不會理解那些「不受歡迎」的API。
這是一個協程實現(需要隨機跳轉) – jameszhao00
有經驗的開發人員絕對會知道這些「不受歡迎」的API做什麼。幾十年來,它們一直是標準C庫的一部分。 – Novelocrat
有經驗的開發人員絕對會知道這些功能的作用。他們也會知道在C中使用它們是很棘手的事情(儘管有時是必需的),而且在C++中非常危險。 –
這不是特定於Linux或gcc;如果您使用longjmp離開具有析構函數的自動變量的上下文,setjmp/longjmp和C++不能很好地協同工作。
析構函數不會運行,這可能會導致內存泄漏或其他不良行爲。
你能解釋一下如何使用顯式內存刪除和析構函數來調用longjmp嗎? – jameszhao00
通常,只要有某種方式可以退出C++(返回,拋出或其他)的作用域,編譯器就會發出指令來調用dtors以獲取任何自動變量,這些自動變量因離開該塊而需要銷燬。 'longjmp()'只是跳轉到代碼中的一個新位置,所以它不會提供調用dtors的機會。標準實際上不是那麼具體 - 標準並沒有說dtors不會被調用 - 它說所有的投注都是關閉的。在這種情況下,你不能依賴任何特定的行爲。 –
我對智能指針不太熟悉。如果我在棧上有一個智能指針,當我做一個longjmp時,這是否意味着智能指針不會刪除一個refcount?另外,我是否安全,如果我禁用異常並編寫不會與longjmp瘋狂的代碼? – jameszhao00