Live555 RTSPServer 对象销毁不当或库错误?

Live555 RTSPServer object destroyed improperly or the library bug?

我在销毁 RTSPServer 对象时遇到问题:应用程序崩溃并出现 SIGSEGV 错误。但是 RTSPServer 对象只有在我不接触所有其他对象的情况下才会被销毁。 这是库错误还是我做错了什么?

他们最近的 live555 changelog 说:

2015.05.12:
- Updated the previous revision to change the order in which fields are deleted 
  in the "RTSPServer" destructor, to avoid a possible crash if "RTSPServer" 
  objects are deleted. (Thanks to ChaSeop Im for noting the problem.)

这是我的析构函数:

RTSPServerH264::~RTSPServerH264()
{
    LOG(INFO) << "RTSP server close: destroying objects";

    if (mSms.size() > 0)
    {
        LOG(INFO) << "destroying: Server Media Subsession vector";
        for (ServerMediaSession* s : mSms)
        {
            s->deleteAllSubsessions();
            Medium::close(s);
        }
        mSms.clear();
        mLiveSubsession.clear();
    }

    if (mRTSPServer)
    {
        LOG(INFO) << "destroying: RTSPServer";
        // BUG: Destroying RTSPServer object crashes the whole application!
        Medium::close(mRTSPServer);
    }

    if (mUsageEnvironment)
    {
        LOG(INFO) << "destroying: Usage Environment";
        mUsageEnvironment->reclaim();
    }

    if (mTaskScheduler)
    {
        LOG(INFO) << "destroying: Task Scheduler";
        delete mTaskScheduler;
    }
}

我的问题的答案现在可以在这里找到: http://lists.live555.com/pipermail/live-devel/2015-June/019490.html

回复文字:

I have a problem using Medium::close() in my destructor when deleting an RTSPServer object after I have already deleted ServerMediaSession* objects vector (of course, using Medium::close() too).

首先,请确保您使用的是最新版本的软件 (与删除 RTSPServer's 有关的错误已在版本中修复 2015.06.24).

其次,请注意,一旦您添加了 ServerMediaSession 反对 RTSPServer,您必须 而不是 删除 ServerMediaSession 对象通过调用 Medium::close()。反而, 你必须使用 GenericMediaServer::deleteServerMediaSession()GenericMediaServerRTSPServer 的基数 class),因此 RTSPServer 被告知正在 ServerMediaSession 对象 已删除。

不过,最后请注意,您不需要删除 ServerMediaSession 个对象之前删除一个 RTSPServer,因为 RTSPServer 析构函数将自动删除任何 ServerMediaSession(以及 ClientConnectionClientSession) 它管理的对象。相反,您可以调用 Medium::close() 在你的 RTSPServer 对象上。

罗斯·芬利森, Live Networks, Inc., http://www.live555.com/