【问题标题】:Why I must provide pointer and not SharedPtr into some methods of poco为什么我必须在 poco 的某些方法中提供指针而不是 SharedPtr
【发布时间】: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


【解决方案1】:

查看POCO Forum上的讨论。

【讨论】:

    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 2012-10-30
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多