Форум ApacheDev

Apache isn't the fastest or maximally customizable web server, its popularity comes from the fact that it provides a very good balance of these things bundled with maximum portability and reliability.

Вы не зашли.

#1 2007-08-23 12:43:35

archimag
Новичок
Зарегистрирован: 2007-08-02
Сообщений: 3
Рейтинг :   

Проблемы с вызовами конструкторов/деструктор С++ при разработке модуля

Столкнулся с проблемой, которая совершенно сбила меня с толку - до сих пор сталкиваться с подобным не приходилось.

Значит, есть библиотека, которая используется в отдельном cli-приложении и в apache-вском модуле. Библиотека нормально обложена тестами, да в cli-приложении ведёт себе совершенно адекватно, но вот в апачевском модуле...

Есть такой проблемный код:
struct tander::REST::catalog::pimpl {
typedef std::map<std::string, boost::shared_ptr<catalog> > catalog_map_type;
typedef std::map<std::string, boost::shared_ptr<conveyor> > http_method_conveoyr_map_type;
typedef std::map<std::string, http_method_conveoyr_map_type> url_conveyor_map_type;

catalog_map_type catalog_map_;
url_conveyor_map_type url_map_;
http_method_conveoyr_map_type item_map_;
};

Теперь, при после вызова конструктора pimpl, обращение к item_map_ ведёт к падению процесса apache с сообщением "Segmentation fault". Добавление виртуального деструктора к pimpl ведёт к тому, что процесс падает при обращение к любой члену pimpl. Однако, если вместо непосредственного вызова конструктор использовать такой вот код:

pimpl_ = reinterpret_cast<pimpl*>(operator new(sizeof(pimpl)));
new (&pimpl_->catalog_map_) pimpl::catalog_map_type;
new (&pimpl_->url_map_) pimpl::url_conveyor_map_type;
new (&pimpl_->item_map_) pimpl::http_method_conveoyr_map_type;

То всё работает отлично. Дальнейшее иследование показало, что

pimpl_ = reinterpret_cast<pimpl*>(operator new(sizeof(pimpl)));
new (pimpl_) pimpl;

не помогает. Необходима ручная инициализация членов структуры. Т.е. фактически можно достаточно смело утверждать, что дело в ошичной работе оператора размещения для данной структуры.

Другая проблемы, только обнаружил, - не вызываются деструкторы, по крайней мере, не для всех объектов (из-за этого остаются коннекты к базе) (используются только интелектуальные указатели и размещение на стэке, так что, это не проблема в коде). Думаю, причины одни и те же.

Собственно, в чём дело и как победить?

Неактивен

 

#2 2009-01-17 19:15:48

unknown212
Новичок
Зарегистрирован: 2009-01-14
Сообщений: 3
Рейтинг :   

Re: Проблемы с вызовами конструкторов/деструктор С++ при разработке модуля

Прочтите /forum/viewtopic.php?id=3
В этой книге есть вся интересующая вас информация.

Неактивен

 

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson