【发布时间】:2014-12-08 10:08:28
【问题描述】:
我们在我们的项目中使用 Poco,我们发现了 3 个案例让我们对 poco 及其指针手势感到尴尬。
在大多数情况下,当您调用 poco 类的方法时,它接受参数 a Poco::SharedPtr 但有时,它接受参数中的指针。在获得指针的所有权后,在其类中创建 SharedPtr。
有时我们想为 poco 提供一个类来保持它的所有权。例如,防止它在每次通话结束时被破坏。
例如,这个类使用 poco::TaskManager 类来运行一个任务。但是我们必须非常小心,因为我们创建的对象的所有权属于 poco::TaskManager。
CMyClass()
{
m_xplTask = new CXplServiceTask(...);
//task manager take the ownership !! (why ??)
m_taskManager.start(m_xplTask);
}
~CMyClass()
{
//do not delete m_xplTask; because owned by Poco::TaskManager ;-(
}
另一个例子:
我们在本地上下文中使用名为 p 的 CrestRequestHandler 指针将其提供给 HTTPServer。但我们必须在每次通话时创建它!如果可以的话,我们更愿意在成员中创建一个 Poco::ShaaredPtr 并简单地返回它。但是如果我们用这个指针来做,我们就无法知道指针是否还活着。
Poco::Net::HTTPRequestHandler* CHttpRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest& request)
{
//do not keep pointers in shared_ptr or somewhere else, because poco take ownership ;-(
if (boost::istarts_with(request.getURI(), m_webSocketKeyword))
return new CWebSocketRequestHandler(m_notificationCenter);
else if (boost::istarts_with(request.getURI(), m_restKeywordBase))
{
CRestRequestHandler * p = new CRestRequestHandler(m_restKeywordBase);
//do some very long init
std::vector< boost::shared_ptr<web::rest::service::IRestService> >::iterator i;
for (i = m_restService.begin(); i != m_restService.end(); ++i)
p->registerRestService(*i);
p->initialize();
return p;
}
else
{
CWebsiteRequestHandler * p = new CWebsiteRequestHandler(m_configDocRoot);
std::map<std::string, std::string>::iterator i;
for (i = m_alias.begin(); i != m_alias.end();++i)
p->configureAlias(i->first, i->second);
return p;
}
}
另一种情况涉及 TCPServerConnectionFactory 已经在堆栈溢出中发布: Can't use Poco TCPServer and TCPServerConnectionFactory
为什么有些方法总是拥有所有权?不可能有一个签名来提供 SharedPtr 吗?我认为 poco lib 没有太多修改可以做到这一点。
有什么解释吗?
【问题讨论】:
-
我觉得这个问题(“为什么这个那个那个那个……”)太宽泛了,属于pocoproject forum。
-
我认为这个问题可以引起其他人的兴趣,并且它对堆栈溢出有更多的可见性
-
这确实是poco论坛的问题。在 2.0 中将在一定程度上重新设计接口,将 poco shared per 与标准的对齐。 Poco 是开源和免费的 - 没有什么能阻止您提出更改和贡献代码来减轻您的痛苦。
-
好的,我刚刚在 poco 论坛上发布了这个问题。对于那些感兴趣的人:pocoproject.org/forum/viewtopic.php?f=12&t=6403
标签: c++ pointers poco-libraries conceptual