[049] JUCE Diary #8: Memory Might Leak
先前提到 JUCE 應用程式的初始化區塊之一為 initialise
method。程式執行時,在初始化階段有一常見的情境:
一旦某一條件成立或某些條件不成立時需停止執行。
若在 initialise
發現程式必須終止,最直覺的作法是呼叫 systemRequestedQuit
。不過,這麼做在 Windows 上會出現 Memory Leak,如下圖:
解決方法是離開 initialise
後再想辦法停止執行,但 initialise
無回傳值(void),故無法以回傳值停止。MessageManager::callAsync
可以在 Main Thread 執行特定程式區塊,適合用法解決我們遇到的問題。寫法如下:
MessageManager::callAsync([this]()
{
systemRequestedQuit();
});
上面程式碼寫在 initialise
裡,翻成白話文:把 systemRequestedQuit()
塞到 Message Thread(通常就是 Main Thread)等待執行,然後繼續跑 initialise
。
效果就是 initialise
跑完後,你的程式接著就開始進行一個關閉的動作: shutdown
會被呼叫,然後程式正常終止。
像 MessageManager::callAsync
這種好用的工具可以節省許多開發資源。JUCE 提供了許多這類工具,所以讓我愛不釋手。