Мы используем Poco в нашем проекте, и мы обнаружили 3 случая, когда мы смущены poco и его указательным жестом.Почему я должен предоставить указатель, а не SharedPtr, в некоторые методы poco
В большинстве случаев, когда вы вызываете mathod класса poco, он принимает параметр Poco :: SharedPtr <>, но иногда он принимает указатель в параметре. После получения права собственности на указатель, создающий SharedPtr <> внутри своего класса.
Иногда мы хотели бы предоставить класс, чтобы сохранить его право собственности на него. Например, чтобы предотвратить его отрыв в конце каждого вызова.
Например, этот класс использует класс 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 ;-(
}
Другой пример:
Мы используем указатель 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] (http://pocoproject.org/forum/). – TobiMcNamobi
Я думаю, что этот вопрос может заинтересовать других людей, и он имеет большую видимость при переполнении стека – lgm42
Это действительно вопрос для форума poco. В 2.0 будет редизайн интерфейсов, с выравниванием poco по стандартным. Poco является открытым исходным кодом и бесплатным - нет ничего, что помешало бы вам предлагать изменения и внесение кода, чтобы облегчить ваши боли. – Alex