2014-12-08 1 views
3

Мы используем 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 не так много изменений.

Любое объяснение?

+3

Я думаю, что этот вопрос («Почему это и что так и так ...») слишком широк и скорее принадлежит к [форуму pocoproject] (http://pocoproject.org/forum/). – TobiMcNamobi

+1

Я думаю, что этот вопрос может заинтересовать других людей, и он имеет большую видимость при переполнении стека – lgm42

+0

Это действительно вопрос для форума poco. В 2.0 будет редизайн интерфейсов, с выравниванием poco по стандартным. Poco является открытым исходным кодом и бесплатным - нет ничего, что помешало бы вам предлагать изменения и внесение кода, чтобы облегчить ваши боли. – Alex

ответ

0

См. Обсуждение на POCO Forum.

+0

Да, это мое! Но у других может быть ссылка, thx – lgm42

Смежные вопросы