Live555客户端流式内存泄漏 我使用liv55来实现IP摄像机的C++ RTPS客户端。 我使用了大部分testRTSPClient代码

Live555客户端流式内存泄漏 我使用liv55来实现IP摄像机的C++ RTPS客户端。 我使用了大部分testRTSPClient代码,c++,memory-leaks,poco,live555,C++,Memory Leaks,Poco,Live555,我也使用了Poco库和Poco::Thread类 换句话说,每个摄像头的任何客户端都在一个单独的线程中运行,该线程拥有其Live555对象的实例(正如Live555-devel所建议的,任何线程都使用其UsageEnvironment和TaskScheduler的实例)。这是为了避免共享变量和同步。它似乎工作得又好又快 我的runnable(遵循Poco库要求)对象IPCamera的run方法非常简单: void IPCamera::run() { openURL(_myEnv, "", _

我也使用了Poco库和Poco::Thread类

换句话说,每个摄像头的任何客户端都在一个单独的线程中运行,该线程拥有其Live555对象的实例(正如Live555-devel所建议的,任何线程都使用其UsageEnvironment和TaskScheduler的实例)。这是为了避免共享变量和同步。它似乎工作得又好又快

我的runnable(遵循Poco库要求)对象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) 连接线程(实际上是终止的,因为它从run方法退出)

d) 如图所示,销毁_myEnv和_myScheduler

e) 销毁所有其他对象,包括IPCamera和关联的线程

->Valgrind未发现内存泄漏。嗯

现在问题来了

2) 案例:我正在实现一个用例,其中Poco::计时器使用ICMP ping每隔X秒检查一次相机是否处于活动状态。它会引发一个事件(使用Poco事件),以防由于网络故障而无法应答,我会执行以下操作:

IPCamera down:

a) 将_watchEventLoopVariable=1从run方法退出

b) 关闭与IPCamera关联的客户端,如图所示

c) 接线

我不会破坏线程,因为我希望在网络再次启动且摄像头再次工作时重新使用它。在这种情况下: a) 我将_eventWatchVariable设置为0。 b) 让我们用:myThread->run()重新启动线程

Valgrind告诉我,在Live555的一个类H264BufferdPackedFactory::createNewPacket(…)中,发现了内存泄漏:线程中直接丢失了60个字节,间接丢失了20.000个字节。

我发现问题在于TCP上的隧道。在LIVE55中,您可以选择协议的类型。 如果我选择:

 #define REQUEST_STREAMING_OVER_TCP false
我没有任何漏洞。我用了很多次Valgrind来确定(它发现了问题)

如果我使用TCP,那么上述问题就会显现出来