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()
(GenericMediaServer
是 RTSPServer
的基数 class),因此
RTSPServer
被告知正在 ServerMediaSession
对象
已删除。
不过,最后请注意,您不需要删除
ServerMediaSession
个对象之前删除一个 RTSPServer
,因为
RTSPServer
析构函数将自动删除任何
ServerMediaSession
(以及 ClientConnection
和 ClientSession
)
它管理的对象。相反,您可以调用 Medium::close()
在你的 RTSPServer
对象上。
罗斯·芬利森,
Live Networks, Inc.,
http://www.live555.com/
我在销毁 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 anRTSPServer
object after I have already deletedServerMediaSession*
objects vector (of course, usingMedium::close()
too).首先,请确保您使用的是最新版本的软件 (与删除
RTSPServer's
有关的错误已在版本中修复 2015.06.24).其次,请注意,一旦您添加了
ServerMediaSession
反对RTSPServer
,您必须 而不是 删除ServerMediaSession
对象通过调用Medium::close()
。反而, 你必须使用GenericMediaServer::deleteServerMediaSession()
(GenericMediaServer
是RTSPServer
的基数 class),因此RTSPServer
被告知正在ServerMediaSession
对象 已删除。不过,最后请注意,您不需要删除
ServerMediaSession
个对象之前删除一个RTSPServer
,因为RTSPServer
析构函数将自动删除任何ServerMediaSession
(以及ClientConnection
和ClientSession
) 它管理的对象。相反,您可以调用Medium::close()
在你的RTSPServer
对象上。罗斯·芬利森, Live Networks, Inc., http://www.live555.com/