簡體   English   中英

退出控制台后,析構函數無法運行

[英]Destructor not run after exiting console

最近我一直在擺弄GLEW和win32,但遇到了問題。 每當我通過關閉窗口退出應用程序時,都會調用Window類的析構函數,並刪除我的openGL渲染上下文。 我可以說是因為我使用CodeXL測試了程序,並且可以肯定地說我的上下文被刪除了。 但是,如果我通過殺死控制台(使用AllocConsole()創建)退出應用程序,則根據CodeXL不會刪除我的上下文,並且會泄漏內存。 這是應該破壞我上下文的析構函數:

Window::~Window()
{
    wglMakeCurrent(0,0);
    wglDeleteContext(renderingContext);
}

有誰知道為什么關閉控制台,但每當我殺窗口運行時該析構函數不能運行?

任何輸入將不勝感激。

我的上下文不會根據CodeXL刪除並泄漏內存。

是。 所以呢? 該進程已被終止,因此操作系統消耗的所有資源均已釋放。 實際上,如果某個過程無論如何都將終止,則不應清理。 只需將需要保存的內容保存到持久性存儲中,進行必要的通信以使內容與其他進程保持一致,然后終止即可。

遍歷一個過程中的所有資源並釋放/刪除它們,就好像您正在清理並給房屋上油漆工作一樣,然后拆除人員用毀壞的球將其拆除。

在程序終止時,內存泄漏永遠不會成為問題! 內存泄漏是程序運行時的問題:它們使進程消耗越來越多的資源,最終導致系統資源耗盡。 操作系統的反應是殺死占用系統資源的進程,以獲取喘息的空間。

有誰知道為什么在關閉控制台時不運行此析構函數,而是在我殺死窗口時運行該析構函數?

因為這兩個動作是非常不同的東西。 關閉窗口時,系統會發送WM_CLOSE消息,您可以通過適當地離開消息循環來作出反應,該消息循環從主函數返回,並向運行時發出信號,以調用超出范圍的所有對象的構造函數。

關閉控制台窗口時,您的進程將失去其控制終端(AllocConsole將控制台附加為控制終端)。 這是一個關鍵條件,默認行為是立即終止進程。

更新

當然,在流程退出時有一些合法的事情要做。 將事情寫到日志中,也許會在退出之前生成程序最后狀態的自動保存,諸如此類。 對於Windows控制台Windows,您必須安裝處理程序,該處理程序為操作系統提供了一種優雅地處理控制台事件的方法。 此功能稱為HandlerRoutine :(在https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms683242%28v=vs.85%29.aspx中記錄 ),並使用SetConsoleCtrlHandler進行設置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM