1. 程式人生 > >關閉程式後,子執行緒未正確退出引出的記憶體洩露問題

關閉程式後,子執行緒未正確退出引出的記憶體洩露問題

記憶體洩露資訊如下:

 f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {239} normal block at 0x003AADA8, 46 bytes long.
 Data: <| Ox            > 7C D9 4F 78 0E 00 00 00 0E 00 00 00 01 00 00 00
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {237} normal block at 0x003AAD38, 48 bytes long.
 Data: <| Ox            > 7C D9 4F 78 0E 00 00 00 0F 00 00 00 01 00 00 00
f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306)

: {232} client block at 0x003AACB8, subtype c0, 68 bytes long.
a CWinThread object at $003AACB8, 68 bytes long

經查資料:

strcore.cpp   洩露  是由於CString 引起的

thrdcore.cpp  是由於執行緒未能正確退出引起的。

問題是,我仔細檢查了cstring的使用 凡是 GetBuffer的地方 都release掉了 ,應該沒問題了

那最主要因素還是執行緒的原因。

分析:

關閉對話方塊,此時執行對話方塊解構函式,在解構函式末尾,會強制關閉子執行緒函式。

問題就出現在這裡了:

由於,子執行緒是強制關閉的, 所以子執行緒未執行完畢就被關閉了,因此,子執行緒所用到的資源未能及時釋放,由此引起了記憶體洩露

解決方法:  在關閉主程式後,不要強制關閉子執行緒,而是讓他也自動關閉

第一步: 建立全域性變數

BOOL g_bIsValid=FALSE;    // 子執行緒迴圈條件

HANDLE g_hEvent=NULL;  // Event事件

第二步: 在建立執行緒前,建立一個無訊號的event事件

g_hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

第三步: 設定子執行緒迴圈條件,並在迴圈結束後,設定EVENT事件

 while (g_bIsValid)
 {

     ...
 }

 SetEvent(g_hEvent);

第四步: 在主程式的解構函式中,修改g_bIsValid 並呼叫WaitForSingleObject(g_hEvent,INFINITE); 等待事件狀態改變,而不是直接關閉程式。若事件狀態改變 ,則意味 子執行緒函式跳出迴圈,可以正常退出

因此,若直接關閉程式,則子程式可能還沒有正確退出,所以必須要呼叫WaitForSingleObject(g_hEvent,INFINITE); 以保證子執行緒正確退出

 g_bIsValid=FALSE;

 WaitForSingleObject(g_hEvent,INFINITE);
 CloseHandle(g_hEvent);

參考資料:

相關推薦

關閉程式執行正確退出引出記憶體洩露問題

記憶體洩露資訊如下:  f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {239} normal block at 0x003AADA8, 46 bytes long.  Data: <

Linux主執行接收資料執行分別對其操作輸出

本例子雖小,但是融合的執行緒同步,執行緒回收和訊號量的知識。 需要注意pthread_join()和pthread_exit()的用法和區別: pthread_join一般是主執行緒來呼叫,用來等待子執行緒退出,因為是等待,所以是阻塞的,一般主執行緒會依次join所有它建立

jvm堆記憶體溢位其他執行是否可繼續工作

    最近網上出現一個美團面試題:“一個執行緒OOM後,其他執行緒還能執行嗎?”。我看網上出現了很多不靠譜的答案。這道題其實很有難度,涉及的知識點有jvm記憶體分配、作用域、gc等,不是簡單的是與否的問題。     由於題目中給出的OOM,java中

父元件中呼叫元件父元件資料更新傳到元件元件頁面更新的問題

問題描述:父元件呼叫了一個子元件,傳遞了一個id的屬性到子元件,但是在子元件中將這個id的props屬性賦值給了data裡面定義的另外一個屬性myId,並且寫了watch監聽這個id的props。 結果:第一次的時候子元件並沒有更新介面(即data裡面的myId屬性沒有更新);第二次及以後就

C#當執行停止執行建立的定時器會繼續執行

測試程式碼  class Program { static System.Timers.Timer timer; static void Main(string[] args) { Th

執行執行資源衝突解決方案

問題描述,  我開發的任性動圖軟體,曾經遇到過這樣的問題:      任性動圖有一個功能是塗鴉功能,就是將你的塗鴉過程生成動圖,怎麼實現的呢?      有一個主顯示記憶體,用以顯示介面影象  

執行執行10次執行執行5次執行執行10次執行執行5次如此反覆3次

package com.mhm.test1; /** * 子執行緒跑10次,主執行緒跑5次,然後子執行緒再跑10次,主執行緒再跑5次,往返3次 * @author Mahone * */ p

python程序執行 執行的關係

      程序是儲存資料的空間,而執行緒是cpu執行的指令。就好比程序是一個房間,執行緒就是房間中的每一個人。所以每一個程序都必定包含至少一個執行緒。程序和執行緒是相對獨立的,但又是相互依賴的。當主執行緒執行完畢後,子執行緒隨即停止。話不多說,直接上程式碼!!!import

vb.net 開啟EXCEL 關閉程式EXCEL程序仍然存在的問題

寫在每段程式的末尾: ReleaseExcel(Excel)             GC.Collect() 另有單獨一個可呼叫過程: Sub ReleaseExcel(ByRef o As Object)         System.Runtime.I

執行開發(1):主執行前臺執行後臺執行守護執行執行託管執行的關係

1.主執行緒 當一個程式啟動時,就有一個程序被作業系統(OS)建立,與此同時一個執行緒也立刻執行,該執行緒通常叫做程式的主執行緒(Main Thread),因為它是程式開始時就執行的,如果你需要再建立執行緒,那麼建立的執行緒就是這個主執行緒的子執行緒。每個程序至少都有一個

Jni 多執行程式設計執行回撥java方法

由於c++層接收到服務端主動推送tcp資料,所以存在將c++層接收到的socket資料通過層層回撥至java的需求。 以下為c++程式碼段: 1:在c++標頭檔案中定義申明相應回撥函式指標 typedef void (*SwitchStateC

執行情況下執行退出執行會被強制退出

1、程序中執行緒之間的關係 執行緒不像程序,一個程序中的執行緒之間是沒有父子之分的,都是平級關係。即執行緒都是一樣的, 退出了一個不會影響另外一個。 但是所謂的"主執行緒"main,其入口程式碼是類似這樣的方式呼叫main的:exit(main(...))。 main執行完

C++初學者筆記:std::thread執行阻塞主執行的問題

C++ 11 支援跨平臺執行緒啦,當然要嚐嚐鮮 之前用的各平臺執行緒實現方式都不一樣,換個平臺或者換個庫,使用方法就不一樣了 編輯了個小例子,本來以為很容易,誰知道也要撞撞牆。 #include <stdio.h> #include <stdlib.h&g

某團面試題:JVM 堆記憶體溢位其他執行是否可繼續工作?

轉載註明:http://dwz.win/gHc 最近網上出現一個美團面試題:“一個執行緒OOM後,其他執行緒還能執行嗎?”。我看網上出現了很多不靠譜的答案。這道題其實很有難度,涉及的知識點有jvm記憶體分配、作用域、gc等,不是簡單的是與否的問題。 由於題目中給出的OOM,java中OOM又分很多型別;比如:

正確實現執行任務全部完成執行關閉的四種方法

方法一 Thread.sleep 方法二 ExecutorService 方法三 thread.join 方法四 Thread.yield and Thread.

putty等終端在關閉視窗關機的主機會繼續執行命令--即後臺執行 nohup

離線後臺下載 nohup command & 例如: nohup make -j32 & 又如: 離線下載伺服器上的程式碼 nohup repo sync  -j32 &   螢幕上會顯示下面提示資訊: [email protected]:

openwrt 關閉ssh程式繼續執行的方法(備忘)

由於開啟tcpdump來監視網路資料,要長期開著,當關閉SSH後,會出現tcpdump關閉的現象。解決方法,在openwrt中安裝screen軟體,安裝方法opkg update,opkg install screen。安裝完成後,輸入screen回車,在新的介面下,執行t

"Tomcat+Spring+Quartz"解決方案下關閉Tomcat出現"執行關閉出現記憶體洩漏"錯誤

使用"Tomcat+Spring+Quartz"解決方案,在關閉Tomcat時出現如圖1所示錯誤資訊:                                                                                      

C# 解決執行不能操作主執行UI(介面)問題涉及到多執行的概念。

1、在預設情況下,C#不准許在一個執行緒中直接訪問或操作另一執行緒中建立的控制元件,這是因為訪問windows窗體控制元件本質上是不安全的。 2、執行緒之間是可以同時執行的,那麼如果有兩個或多個執行緒同時操作某一控制元件的某狀態,嘗試將一個控制元件變為自己需要的狀態時, 執行緒的死鎖就可能發生。

Qt執行如何更新UI完整的程式碼示例有圖有真相

      Qt涉及到大量的資料更新,影象處理,視訊編解碼時,在主執行緒直接進行會讓主執行緒阻塞,程式直接卡死,直達阻塞的部分完成,介面才更新,例如,我們需要在TextBrowser上迴圈顯示資料。        我需要點選【新增新行資料】,然後每隔1秒迴圈顯示資料,之