c++中幾個段錯誤除錯記錄
阿新 • • 發佈:2019-01-31
1 執行緒中呼叫一個外部函數出現 段錯誤,但是在主執行緒中卻正常
解決方法:將該執行緒的stack_size設定大一點,因為外部函式可能需要的記憶體資源比較多,預設的stack_size不夠
設定方法如下:
bool start(void*(*thread_proc)(void*),void* arg,size_t stack_size=16*1024){ pthread_attr_t attr; size_t stacksize; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr,stack_size); int res=pthread_create(&thread,&attr,thread_proc,(void*)arg); if(res!=0) { thread=0; } return res==0; }
2 pthread_create 方法傳入的方法只能是一個靜態方法,如果需要用成員函式,可以在類裡新增一個static的中間方法,將物件當作引數傳進去,在中間方法中呼叫物件的方法即可。
申明:
static void* thread_proc_callback(void* arg);
void proc_callback();
實現:呼叫:void CCamera::proc_callback() { cout<<"proc_callback enter...."<<endl; this->thread_event_ready=true; imgframe* item; while(!disqueue->stop) { item=disqueue->remove();//will loop to get item until success if(item!=NULL) OnSensorData(*item); delete item; } cout<<"proc_callback exit...."<<endl; } void* CCamera::thread_proc_callback(void* arg) { ((CCamera*)arg)->proc_callback(); }
thread_event.start(thread_proc_callback,(void*)this)
記得最後一個引數this,否則proc_callback()裡面將會出現this=0,段錯誤。
3 pure virtual method called 錯誤
如果父類中有一個純虛擬函式,子類實現,父類中有個執行緒在持續呼叫該虛擬函式。在構析該物件時,就會出現呼叫純虛擬函式的錯誤,這是因為,構析的時候,子類先進行構系,因此方法的子類實現被構析,執行緒裡面呼叫時,只能呼叫父類的了,但是父類中是純虛擬函式。
解決方法,要麼在父類中實現純虛擬函式,要麼構析前先將執行緒kill掉