[Live-devel] Memory leaks ?

kamil kamildobk at poczta.onet.pl
Thu Sep 8 18:08:10 PDT 2005


Hi,
I tested openRTSP.exe and located a few memory-leaks.

1. I run openRTSP.exe -e 5 rtsp://192.168.7.199/mpeg4/1/media.amp

subsession.sessionId is not deleted, it is called only in 
teardownMediaSubsession, which is not called

anywhere. Unfortunately it is not called in teardownMediaSession(). I 
changed subsession desctructor by

adding delete[] sessionId.

MediaSubsession::~MediaSubsession()
{
 delete sessionId;
}

2. I run TCP tunneled RTP by: openRTSP.exe -t -e 5 
rtsp://192.168.7.199/mpeg4/1/media.amp

'socketTable' is not removed. It is deleted in ~RCTPInstance(), but next it 
is immediately created again
in ~MuliFramedRTPSource, and not deleted again because it is empty.

You create 'socketTable' on request in socketHashTable(), but delete it only 
in removeSocketDescriptor()
which is error-prone as 'socketTable' is created initially empty, so 
removeSocketDescriptor() will not be
called in every situation. I changed it to:

void _Tables::reclaimIfPossible() {
    if ( socketTable && ((HashTable*)socketTable)->IsEmpty() )
    {
        delete (HashTable*)socketTable; socketTable = NULL;
    }
    if ( mediaTable == NULL && socketTable == NULL )
    {
        fEnv.liveMediaPriv = NULL; // so why not 
fEnv->reclaimTablesIfPossible()
     // and fEnv->getOutTables() ?
       delete this;
    }
}

and now it deletes socketTable in each situation.

2. I run HTTP tunneled RTP by: openRTSP.exe -t -e 5 
rtsp://192.168.7.199/mpeg4/1/media.amp

In function RTSPClient::setupHTTPTunneling() variable cmd is not deleted 
after first request.
I added a single line:

if ( !sendRequest( cmd, "HTTP GET", False)) break;
delete[] cmd; cmd = NULL;

And there is no memory leaks now. Unfortuanately, I was not able to run 
openRTSP.exe in multicast mode,

so far ( please help ! ), so I was not able to test multicast connection.

PS.
Although those are minor issues it would be easier to track any mistakes if 
all objects allocated and

deleted only their own members. For example:

MediaSubSession::SetSessionId( char *sessionId )
{
 delete[] mSessionId; mSessionId = ::strDup(sessionId);
}

MediaSubsession::~MediaSubsession()
{
 delete mSessionId;
}

or
UsageEnvironment::reclaimTablesIfPossible()
UsageEnvironment::getOurTables()
( it would create UsageEnvironment<-_Tables dependency but it is not such 
wrong )

Also I think that a simple string-wrapper class to manipulate strings, would 
clean the code much.

And what do you think ?

Regards,
Kamil Dobkowski 


_________________________________________________________________
List sprawdzony skanerem poczty mks_vir ( http://www.mks.com.pl )


More information about the live-devel mailing list