我遇到的問題是由於簡單的FreeGLUT C++應用程序中可能的線程濫用而產生的。C++ TinyThread和帶有FreeGLUT的OpenGL
由於退出glutMainLoop()
不能做到優雅,我靠glutLeaveMainLoop()
做了一些工作,但是這並沒有真正給控制權交還給程序的main
功能。我有一個全局指針,將在GL調用之前在main
函數中設置爲在堆上創建的對象實例。在沒有使用atexit
回叫的情況下,雖然我在glutMainLoop
呼叫之後放置了這樣的操作(現在因其無效而被評論),但沒有人會在此實例上呼叫delete
運營商。
下面是我在做什麼僞代碼(我不會發布實際的代碼,因爲它太長過濾):
CWorld* g_world;
AtExit()
{
delete g_world;
}
void main()
{
atexit(AtExit);
// create an instance of an object that creates a thread in its constructor
// via the new operator and joins this thread in its destructor
// calling the delete operator on that pointer to the thread instance
CWidget thisObjectCreatesATinyThread;
g_world = new CWorld();
...
glutMainLoop();
// delete g_world;
}
注意,在主函數中,我還包括一個小部件實例它通過在其構造函數中創建的線程完成一些工作。這個線程被加入到它的析構函數中,然後通過delete
釋放內存。
錯誤的行爲:沒有設定atexit
回調,我得到一個資源泄漏,因爲CWorld
對象的析構函數不會被調用。如果我設置了此回調,那麼由於某種原因delete
運算符會被調用兩次,即使AtExit
函數僅被調用一次。
尋找這種奇怪行爲的來源是什麼地方?
即使我禁用了CWidget實例化,我仍然得到了特殊的行爲。
爲什麼要在使用線程時使用* global *變量? –
由於FreeGLUT庫。它需要某種全局變量來控制並傳遞數據給渲染函數。當涉及渲染或怠速時(例如,在這種情況下顯示回調),其回調函數無法與任何參數一起使用。 – teodron
那麼爲什麼你使用FreeGLUT庫需要一個全局變量(我敢打賭它不)? –