我正在研究一個C++應用程序,它使用另一個團隊用C編寫的庫。當發生錯誤時,庫的編寫者喜歡調用exit()
,這會在不調用C++應用程序中堆棧上的對象的析構函數的情況下立即結束程序。應用程序設置了一些系統資源,這些資源在進程結束後不會自動被操作系統回收(共享內存區域,進程間互斥等),所以這是一個問題。如何處理第三方庫代碼中的exit()調用?
我有完整的應用程序和庫的源代碼,但該庫是非常完善的,並沒有單元測試,所以改變它將是一件大事。有沒有辦法將電話「掛鉤」到exit()
,以便我可以實現我的應用程序的正常關機?這意味着所有的清理會發生無論是在其析構函數或者其成員之一的析構函數 - - 然後分配在這些大的一個對象,我考慮是使一個大的類是應用
一種可能性堆在main()
,設置一個全局指針指向它,並使用atexit()
來註冊一個處理程序,它只是通過全局指針刪除對象。這可能有用嗎?
有沒有一種已知的方法可以解決這個問題?
啊哈!在編譯C庫時,C++應用程序的makefile可以重新定義'exit' - 根本不需要修改代碼。我仍然需要實現從全局處理程序清理整個應用程序的能力,但仍然是迄今爲止最好的答案。 – bythescruff