昨天我在處理視訊流轉碼問題,突然發現一個正常運作的代碼出問題了
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);
問題雖然解決了,而且确實覺得之前的方式有問題(隻是經驗加直覺),但是卻不是很明白到底為啥,有知道問題的歡迎讨論