我正在使用Live555实现用于IP摄像机的C ++ RTPS客户端。
我正在使用大多数testRTSPClient代码。
我也使用了Poco库和Poco :: Thread类。
换句话说,每个摄像机的任何客户端都在单独的线程中运行,例如拥有Live555对象的实例(如live555-devel所建议的,任何线程都将实例与他的UsageEnvironment和TaskScheduler一起使用)。这样可以避免共享变量和同步的东西。它似乎运作良好且快速。
我的可运行对象(遵循Poco库要求)对象IPCamera的运行方法非常简单:
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)情况:运行程序-使用正确运行的所有IPCamera关闭程序。
a)在程序结束时,将调用所有析构函数。
b)从doEventLoop()退出。
c)加入线程(实际上是终止的,因为它从run方法退出。
d)如图所示销毁_myEnv和_myScheduler。
e)销毁所有其他对象,包括IPCamera和关联的线程。
-> Valgrind没有发现内存泄漏。好
现在出现了问题。
2)用例:我正在实现一个用例,其中Poco :: Timer每隔X秒检查一次使用ICMP ping的摄像头是否处于活动状态。它会引发一个事件(使用Poco事件),以防由于网络中断而导致无法响应,请执行以下操作:
IPCamera下:
a)将_watchEventLoopVariable = 1退出run方法;
b)如图所示关闭与IPCamera关联的客户端
c)加入线程
我不会破坏线程,因为我想在网络再次启动并且相机再次工作时重新使用它。
a)我将_eventWatchVariable设置为0。
b)让我们重新开始线程:myThread-> run()
Valgrind告诉我,发现了内存泄漏:在H264BufferdPackedFactory :: createNewPacket(...)(一个Live555类)中,直接丢失了60个字节,线程中丢失了20.000个间接字节。
最佳答案
解决了
我发现问题出在TCP隧道上。在LIVE55中,您可以选择协议的种类。
如果我选择:
#define REQUEST_STREAMING_OVER_TCP false
我没有泄漏。我用了很多次Valgrind来确定(它发现了问题)。
如果我使用TCP,则会出现上述问题。
关于c++ - Live555客户端流式内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27060245/