昨天我在处理视频流转码问题,突然发现一个正常运行的代码出问题了
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);
问题虽然解决了,而且确实觉得之前的方式有问题(只是经验加直觉),但是却不是很明白到底为啥,有知道问题的欢迎讨论