我正在使用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/

10-11 22:44