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