c++ - 为什么我必须向 poco 的某些方法提供指针而不是 SharedPtr

标签 c++ pointers poco-libraries conceptual

我们在我们的项目中使用了 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/

相关文章:

c - 插入二叉搜索树

c - 返回指向静态定义的结构数组的指针

c++ - 网络上对变量、指针、引用和内存地址的最佳解释在哪里?

c++ - 如何检测 Poco 子进程何时崩溃?

c++ - 在 sizeof(++n) 表达式中不调用增量运算符

c++ - 有哪些代码生成技术?

sqlite - SQLCipher + POCO C++

c++ - 没有 unique_ptr 的 Poco::Net::HTTPClientSession 抛出异常

MFC 中的 C++ UTF-8/ASCII 到 UTF-16

c++ - STL 设置自定义排序功能在 Quicy 2005 中有效,但在 MS Studio 2010 中无效