1. 程式人生 > >c++中幾個段錯誤除錯記錄

c++中幾個段錯誤除錯記錄

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掉