喂例外解開,C++:堆棧是不是拋出
我有一個很奇怪的問題,在我的C++項目之一: 我寫了一個C++的Socket封裝,嘗試連接到指定主機和端口(通過IPv4/TCP),並拋出一個SocketException(從std :: runtime_error派生),如果發生錯誤(例如'連接被拒絕')。異常被正確捕獲並且錯誤消息按預期寫入控制檯,但顯然我的Socket類的析構函數未被調用(它也應該向std :: cerr輸出消息,但消息僅在連接正常工作時纔會顯示並且如果套接字超出堆棧,套接字將在以後被銷燬,例如,在嘗試使用套接字的函數結束時)。析構函數應關閉封裝的套接字,但在拋出異常時,套接字保持打開狀態(您可以使用lsof作爲未知類型的套接字來查看它),因此絕不會執行析構函數中的任何代碼)。 由於我不能用簡單的測試用例來重現這個問題,我的猜測是它在某種程度上與我的項目的相當複雜的結構有關:我有一個核心應用程序,它包含Socket類的代碼並提供一個Singleton類提供了實現用於通信的協議並返回請求結果的方法,每次調用其中一個方法都會生成它自己的Socket實例,併爲其提供有關要使用的主機和端口的必要信息。爲了簡化套接字的生成和管理,我們使用了一個std :: auto_ptr,它應該刪除Socket if方法已經完成並且清理了堆棧,根據控制檯的輸出它可以正常工作,但是對拋出的異常應該以相同的方式工作,至少這是我的意見到現在爲止。 核心能夠通過dlopen以共享對象格式加載插件,並通過共享對象中的extern C聲明函數獲取指向插件類實例的指針。 此實例現在使用核心提供的Singleton與服務器進行通信並顯示檢索到的數據。
我的問題是:使用共享對象時是否存在堆棧展開的限制,或者我應該在哪裏尋找錯過的元素以使其正常工作?
代碼勝於雄辯職位的代碼,它會更容易分析 – 2010-11-05 12:14:37
其他信息:OS,這是在試圖爲Linux的,GCC 4.3.2(Debian Lenny)和GCC 4.4.x(Sabayon和Ubuntu Linux),glibc版本範圍從2.7到2.11 – crispinus 2010-11-05 12:14:40
你準備發生的事情沒有發生,程序很複雜,怎麼了? – 2010-11-05 12:15:06