我使用Live555實現IP攝像頭的C++ RTPS客戶端。 我正在使用大部分testRTSPClient代碼。Live555客戶端流媒體內存泄漏
我也使用了Poco庫和Poco :: Thread類。
換句話說,每個攝像頭的任何客戶端都運行在一個單獨的線程中,擁有其Live555對象實例(如live555-devel所示,任何線程都在UsageEnvironment和TaskScheduler中使用實例)。這是爲了避免共享變量和同步的東西。它似乎運作良好和快速。
我可運行(繼波蘇庫需求)對象IPCamera的具有run方法簡單:
void IPCamera::run()
{
openURL(_myEnv, "", _myRtspCommand.c_str(), *this); //taken from the testRTSPClient example
_myEnv->TaskScheduler().doEventLoop(&_watchEventLoopVariable);
//it runs until _watchEventLoopVariable change to a value != 0
//exit from the run;
}
當運行完成後我打電話join()方法來關閉線程(由我想通的方式如果我不調用myThread-> join(),內存不會完全釋放)。
在關機時,按照LIVE555-devel的,我把我的代碼的要求:
void IPCamera::shutdown()
{
...
_myEnv->reclaim();
delete _myScheduler;
}
使用Valgrind的檢測內存泄漏我看到一個奇怪的現象:
1)情況:運行程序 - 用適當方式運行的所有IPCameras關閉程序。
a)程序結束時調用所有的析構函數。
b)從doEventLoop()退出。
c)中加入的螺紋(實際上被終止,因爲它從運行方法退出。
d)破壞_myEnv和_myScheduler作爲顯示。 e)銷燬其他所有對象,包括IPCamera和Thread關聯。
- > Valgrind沒有發現內存泄漏。好吧
現在出現這個問題。
2)案例:我正在實現一個用例,其中Poco :: Timer每隔X秒檢查一次,如果相機使用ICMP ping工作。這引發一個事件(使用波科事件)的情況下,它不會回答,因爲在網絡出現故障,我做了如下:
IPCamera的下降:
一)把_watchEventLoopVariable = 1到退出運行方法;
B)關機)關聯到IPCamera的作爲顯示
c中的客戶端連接線程
我不破壞線程,因爲我想再次重用它當網絡並在攝像頭能again.And在這種情況下: 一)我設置_eventWatchVariable = 0 b)與我們再次啓動線程:myThread-> run()的
Valgrind的告訴我,內存泄漏被發現:60個字節直接,20。000個間接字節在線程中丟失,在H264BufferdPackedFactory :: createNewPacket(...)中,這是Live555的一個類。