gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:15:50 40 4
gpt4 key购买 nike

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

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com