我们在我们的项目中使用了 Poco,我们发现了 3 个我们对 poco 及其指针手势感到尴尬的情况。
在大多数情况下,当您调用 poco 类的方法时,它会接受参数 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 的修改并不多。
有什么解释吗?
最佳答案
参见关于 POCO Forum 的讨论.
关于c++ - 为什么我必须向 poco 的某些方法提供指针而不是 SharedPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27355589/