這樣的問題應該大多出現在大的程式裡面,出現這樣問題一般具備幾個條件:
1、全域性物件太多;
2、多執行緒;
3、執行緒很多,主程序沒有等待執行緒結束
4、主程序由於某種原因終止
原因分析:
首先全域性物件太多,主程序結束時需要一定的時間析構各全域性物件;此時,先析構的全域性物件由於主程序忙著析構其他的全域性物件,所以執行緒依然是可以訪問這部分記憶體的,可是,由於已經析構了,所以可能導致執行緒程式出問題或奔潰。
下面以乙個例子來說明:
#include #include #include #include using namespace std;
struct constructsleep
};struct test
};//constructsleep g_c; //後析構
test g_class;
constructsleep g_c; //先析構
void* pthread(void*)
return null;
}int main()
g_c定義在g_class前後,對輸出結果有差別。
為避免出現上述錯誤,有以下幾點需要遵循:
1、盡可能少使用全域性物件
2、在使用全域性物件時,要有一定的檢測錯誤機制(極端情況下,這也不能避免錯誤)
3、最好主程序要等待執行緒結束(但是執行緒是while迴圈就不可能了)
4、龐大的全域性物件要後定義,這樣就可以先析構。
執行緒自我終止會導致執行緒內部物件的析構異常?
一開始主線程a是作為乙個對話方塊ctestdlg存在,現在,在ctestdlg的成員函式onstartthread中開始乙個新執行緒b,onstartthread函式中cstring區域性變數stra 注1 作為執行緒b工作函式的引數pparam,ctestdlg的成員函式onendthread用於...
C 全域性物件構造和析構
注 此為小白引導教程 引入 c 中的全域性物件什麼時候執行建構函式?什麼時候執行析構函式?與區域性物件又有什麼區別?正文 思路是這樣的,我們先寫乙個類,乙個有點簡單 又不簡單 的類 include include using std string using std cout using std e...
多執行緒執行(限制執行緒數)
多執行緒執行 限制執行緒數 coding utf 8 import threading from ctypes import import queue,os import time,datetime class store threading.thread def init self,store,q...