Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > boost::regex, ошибка


Автор: andrew_121 7.9.2009, 08:34
Здравствуйте!

Вот код:
Код

#include "boost/regex.hpp"

int main(int argc, const char** argv) {
   boost::regex rx("");
   return 0;
}

Вот ошибка:
Код

Unhandled exception at 0x00da2f78 in test.exe: 0xC0000005: Access violation reading location 0xfffffffc.


MSVC2008, boost-1.39.0

Собирал так:
Код

bjam --build-type=complete --with-regex --toolset=msvc-9.0 stage


 smile 

Автор: azesmcar 7.9.2009, 08:42
andrew_121

Цитата(andrew_121 @  7.9.2009,  08:34 Найти цитируемый пост)
Unhandled exception 

А не лучше ли exception поймать и посмотреть текст ошибки? smile 

Автор: andrew_121 7.9.2009, 09:06
Цитата(azesmcar @  7.9.2009,  08:42 Найти цитируемый пост)
А не лучше ли exception поймать и посмотреть текст ошибки?

Так не ловится smile 
Код

int main(int argc, const char** argv) {
    boost::regex rx; /** здесь все ок */
    try {
        rx.assign(""); /** здесь ошибка */
    } catch (boost::exception& e) {
        std::cout << diagnostic_information(e) << std::endl;
    } catch (std::exception& e) {
        std::cout << e.what() << std::endl;
    } catch (...) {
        std::cout << "Error!" << std::endl;
    }
   return 0;
}

Автор: azesmcar 7.9.2009, 09:16
А что говорит отладчик?

Автор: Cheloveck 7.9.2009, 09:20
libboost_regex-vc90-mt-gd-1_39.lib подключи, с отладочной инфой

Автор: andrew_121 7.9.2009, 09:21
Дебагер показывает тут:
http://ipicture.ru/

Файл: C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\xutility

Объект:
Код

    // CLASS _Iterator_base
class _Iterator_base : public _Iterator_base_universal { // store links to container, next iterator

Метод:
Код

void __CLR_OR_THIS_CALL _Orphan_me()
{    // cut ties with parent
    if (_Mycont != 0 && _Mycont->_Myfirstiter != _IGNORE_MYITERLIST)
    {    // adopted, remove self from list
        _Iterator_base **_Pnext =
            (_Iterator_base **)&_Mycont->_Myfirstiter;
        while (*_Pnext != 0 && *_Pnext != this)
            _Pnext = &(*_Pnext)->_Mynextiter;
            if (*_Pnext == 0)
            _DEBUG_ERROR("ITERATOR LIST CORRUPTED!");
        *_Pnext = _Mynextiter;
        _Mycont = 0;
    }
}

Автор: andrew_121 7.9.2009, 10:14
Вот call stack, может поможет
Код

test.exe!std::_Iterator_base::_Orphan_me()  Line 181 + 0xd bytes    C++
test.exe!std::_Iterator_base::~_Iterator_base()  Line 162    C++
test.exe!std::_Ranit_base<char,int,char const *,char const &,std::_Iterator_base>::~_Ranit_base<char,int,char const *,char const &,std::_Iterator_base>()  + 0x11 bytes    C++
test.exe!std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char> >::~_String_const_iterator<char,std::char_traits<char>,std::allocator<char> >()  + 0x11 bytes    C++
test.exe!std::_String_iterator<char,std::char_traits<char>,std::allocator<char> >::~_String_iterator<char,std::char_traits<char>,std::allocator<char> >()  + 0x11 bytes    C++
test.exe!boost::re_detail::w32_transform(unsigned long id=1049, const char * p1=0x0012f070, const char * p2=0x0012f071)  Line 377    C++
test.exe!boost::re_detail::w32_regex_traits_implementation<char>::transform(const char * p1=0x0012f070, const char * p2=0x0012f071)  Line 328 + 0x17 bytes    C++
test.exe!boost::re_detail::find_sort_syntax<boost::re_detail::w32_regex_traits_implementation<char>,char>(const boost::re_detail::w32_regex_traits_implementation<char> * pt=0x0158b968, char * delim=0x0158bdc4)  Line 77 + 0x14 bytes    C++
test.exe!boost::re_detail::w32_regex_traits_implementation<char>::w32_regex_traits_implementation<char>(unsigned long l=1049)  Line 506 + 0x19 bytes    C++
test.exe!boost::object_cache<unsigned long,boost::re_detail::w32_regex_traits_implementation<char> >::do_get(const unsigned long & k=1049, unsigned int max_cache_size=5)  Line 118 + 0x31 bytes    C++
test.exe!boost::object_cache<unsigned long,boost::re_detail::w32_regex_traits_implementation<char> >::get(const unsigned long & k=1049, unsigned int max_cache_size=5)  Line 69 + 0x11 bytes    C++
test.exe!boost::re_detail::create_w32_regex_traits<char>(unsigned long l=1049)  Line 554 + 0xf bytes    C++
test.exe!boost::w32_regex_traits<char>::w32_regex_traits<char>()  Line 573 + 0x16 bytes    C++
test.exe!boost::regex_traits<char,boost::w32_regex_traits<char> >::regex_traits<char,boost::w32_regex_traits<char> >()  Line 75 + 0xf bytes    C++
test.exe!boost::regex_traits_wrapper<boost::regex_traits<char,boost::w32_regex_traits<char> > >::regex_traits_wrapper<boost::regex_traits<char,boost::w32_regex_traits<char> > >()  Line 169 + 0xf bytes    C++
test.exe!boost::re_detail::regex_data<char,boost::regex_traits<char,boost::w32_regex_traits<char> > >::regex_data<char,boost::regex_traits<char,boost::w32_regex_traits<char> > >()  Line 61 + 0x4a bytes    C++
test.exe!boost::re_detail::basic_regex_implementation<char,boost::regex_traits<char,boost::w32_regex_traits<char> > >::basic_regex_implementation<char,boost::regex_traits<char,boost::w32_regex_traits<char> > >()  Line 96 + 0xf bytes    C++
test.exe!boost::basic_regex<char,boost::regex_traits<char,boost::w32_regex_traits<char> > >::do_assign(const char * p1=0x00f27126, const char * p2=0x00f27126, unsigned int f=0)  Line 542 + 0x22 bytes    C++
test.exe!boost::basic_regex<char,boost::regex_traits<char,boost::w32_regex_traits<char> > >::assign(const char * p1=0x00f27126, const char * p2=0x00f27126, unsigned int f=0)  Line 274    C++
test.exe!boost::basic_regex<char,boost::regex_traits<char,boost::w32_regex_traits<char> > >::assign(const char * p=0x00f27126, unsigned int f=0)  Line 259    C++
test.exe!main(int argc=1, const char * * argv=0x00384eb0)  Line 119 + 0xf bytes    C++
test.exe!__tmainCRTStartup()  Line 582 + 0x19 bytes    C
test.exe!mainCRTStartup()  Line 399    C
kernel32.dll!7c817077()    
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]    


Автор: Lazin 7.9.2009, 12:36
может стоит попробовать сделать так:
Код

try
{
  boost::regex rx("");
}
catch(boost::bad_expression const& e)
{
  ...
?

Добавлено через 4 минуты и 31 секунду
по идее, boost::regex будет кидать exception при попытке создать рег.выр. из пустой строки
кидает он в этом случае bad_expression, что-бы оно обрабатывалось нужно подключить какой-то заголовочный файл, посмотри документацию

Автор: andrew_121 7.9.2009, 14:01
Цитата(Lazin @  7.9.2009,  12:36 Найти цитируемый пост)
может стоит попробовать сделать так:

сделал. даже буст пересобрал. все то же.
Код

int main(int argc, const char** argv) {
    try {
        boost::regex rx("");
    } catch(boost::bad_expression const& e) {
        std::cout << e.what() << std::endl;
    } catch (boost::exception& e) {
        std::cout << diagnostic_information(e) << std::endl;
    } catch (std::exception& e) {
        std::cout << e.what() << std::endl;
    } catch (...) {
        std::cout << "Error!" << std::endl;
    }
   return 0;
}


Цитата(Lazin @  7.9.2009,  12:36 Найти цитируемый пост)
по идее, boost::regex будет кидать exception при попытке создать рег.выр. из пустой строки

это я для примера рег.выр. убрал.

что еще попробовать?

Автор: Lazin 7.9.2009, 14:58
возможно дело в том, что библиотека boost.regex и проект собирались с разными настройками, к примеру, приложение может использовать отладочную версию crt, а библиотека собиралась с обычной, или библиотека использует стат. версию CRT, а приложение - динамическую.

Цитата(andrew_121 @  7.9.2009,  14:01 Найти цитируемый пост)
это я для примера рег.выр. убрал.

ну тогда спасибо, что потратил мое время smile 

Автор: andrew_121 7.9.2009, 15:22
Цитата(Lazin @  7.9.2009,  14:58 Найти цитируемый пост)
ну тогда спасибо, что потратил мое время

я не нарочно smile

Добавлено @ 15:29
Цитата(Lazin @  7.9.2009,  14:58 Найти цитируемый пост)
возможно дело в том, что библиотека boost.regex и проект собирались с разными настройками, к примеру, приложение может использовать отладочную версию crt, а библиотека собиралась с обычной, или библиотека использует стат. версию CRT, а приложение - динамическую.

Приложение написано с использованием boost. Все остальное работает. И все библиотеки boost собирались единажды, с одной командной строкой.
Когда мне по окончанию проекта понадобилось добавить boost.regex, всплыла эта ошибка. Я, для того чтоб ее локализовать, собрал этот пример в отдельном проекте. Проект - debugboost сам подцепил библиотеки, ему виднее, наверное тоже debug.
Не хотелось бы из-за двух регулярок, использовать что-то стороннее.

Автор: vinter 7.9.2009, 15:32
в примере ошибки нет, исключений там быть никаких не должно. Ройся в настройках проекта.

Автор: andrew_121 7.9.2009, 16:04
Цитата(vinter @  7.9.2009,  15:32 Найти цитируемый пост)
Ройся в настройках проекта. 

А на что обратить внимание? просто я начинающий в плане работы с MSVC

Автор: Cheloveck 7.9.2009, 17:35
Цитата(andrew_121 @  7.9.2009,  16:22 Найти цитируемый пост)
Приложение написано с использованием boost. Все остальное работает. И все библиотеки boost собирались единажды, с одной командной строкой.

не все библиотеки boost используют либы. Многие просто в хедерах, как то spirit, например.

Автор: andrew_121 7.9.2009, 17:51
Cheloveck, я про те что собраны как либы.

Автор: Lazin 7.9.2009, 18:58
Цитата(andrew_121 @  7.9.2009,  16:04 Найти цитируемый пост)
А на что обратить внимание?

раздел Code Generation в свойствах проекта, попробуй собрать с другой версией CRT (желательно, сделать clean project)

Автор: andrew_121 8.9.2009, 17:40
Цитата(Lazin @  7.9.2009,  18:58 Найти цитируемый пост)
раздел Code Generation в свойствах проекта, попробуй собрать с другой версией CRT (желательно, сделать clean project) 

то же самое.
не знаю в чем еще может быть проблема smile  у остальных же работает.

установил это: http://www.microsoft.com/downloads/details.aspx?FamilyId=D466226B-8DAB-445F-A7B4-448B326C48E7&displaylang=en работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)