天天看點

c++ 異常崩潰記錄1

昨天我在處理視訊流轉碼問題,突然發現一個正常運作的代碼出問題了

class LocalRecordingClient

{

public:

    LocalRecordingClient(UINT32 uDST,UINT32 uCameraId);

    ~LocalRecordingClient();

    ...

    bool IsRuning(){AutoLinuxLock lock(&m_lockRun); return m_bRun;};  //gdb 調試崩潰到這裡

    void setRuning(bool bRun){AutoLinuxLock lock(&m_lockRun); m_bRun = bRun;};

    ...

private:

    bool        m_bRun;

    pthread_t m_pthread;

    LinuxLock m_lockRun;

    ...

    u_int8_t videoData[500*1024];

};

調用線程鎖崩潰了,我首先想到的是鎖的父類指針被釋放了,但是經過檢視代碼發現父類指針沒有被釋放

那麼隻有可能是莫名其妙的原因造成了野指針,經測試發現全局隻有這個類有問題其它代碼都正常,而且和視訊資料有關系

視訊資料轉碼資料錯誤時才會觸發這個崩潰,這個時候我就想到了可能跟這個代碼有關系

u_int8_t videoData[500*1024];

這個記憶體太大了,可能異常情況會影響這個類的記憶體,我就嘗試着把它換成指針,但還是成員變量,發現又崩潰到了另一個地方,感覺這樣修改有效果但是還是存在問題,然後我就在調用它的地方建立下,用完釋放問題就解決了

這個是子線程中調用的,而且會一路攝像頭開啟一個

       uint8_t* videoData = (uint8_t*)malloc(500*1024);

        memset(videoData,0,500*1024);

        while (this->IsRuning()) {

             ...

        }

        free(videoData);

問題雖然解決了,而且确實覺得之前的方式有問題(隻是經驗加直覺),但是卻不是很明白到底為啥,有知道問題的歡迎讨論

繼續閱讀