[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 提供了許多這類工具,所以讓我愛不釋手。

CTO of I³D Technology Inc. 🇹🇼 ▐ Blogging at https://samtsai.org ▐ Playing WorkFlowy at http://workflowy.tips/ ▐ Learn what I am doing: https://samtsai.org/now/