#1990 closed Bugs (fixed)
xpressive: passing temporary regex to sregex_token_iterator causes runtime assertion
Reported by: | Owned by: | Eric Niebler | |
---|---|---|---|
Milestone: | Boost 1.36.0 | Component: | xpressive |
Version: | Boost 1.35.0 | Severity: | Problem |
Keywords: | Cc: |
Description
This program suprises me by causing a runtime assertion:
#include <string> #include <boost/xpressive/xpressive.hpp> using namespace boost::xpressive; int main() { std::string x("a\tb\tc"); sregex_token_iterator cur(x.begin(), x.end(), as_xpr("\t"), -1), end; for(; cur != end; ++cur) ; }
...the assertion:
suprise: /usr/local/include/boost-1_35/boost/xpressive/detail/utility/tracking_ptr.hpp:196: void boost::xpressive::detail::enable_reference_tracking<Derived>::release() [with Derived = boost::xpressive::detail::regex_impl<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >]: Assertion `0 < this->cnt_' failed. Aborted
Changing the declarations like this causes it to work as I expect:
sregex tab_delim(as_xpr("\t")); sregex_token_iterator cur(x.begin(), x.end(), tab_delim, -1), end;
...maybe there's some "temporary" magic happening, or that I was just plain doing something I shouldn't have been doing (silly me!), or both?
[Note: Boost 1.35, OpenSuSE 10.3, g++ 4.1.2]
Eric Niebler's reply of 4/6/2008:
Interesting. Currently the regex iterators hold a (bare) pointer to the regex to be used. If you pass in a temporary regex, it'll obviously not live long enough. It wouldn't be hard to make the regex iterators hold a reference count to the regex impl, which would make your code work. The down-side would be that copying regex iterators (a common operation?) would be more expensive.
Change History (3)
comment:1 by , 14 years ago
Component: | None → xpressive |
---|---|
Owner: | set to |
comment:2 by , 14 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:3 by , 14 years ago
(In [46656]) Merged revisions 46655 via svnmerge from https://svn.boost.org/svn/boost/trunk
........
r46655 | eric_niebler | 2008-06-24 09:24:50 -0700 (Tue, 24 Jun 2008) | 1 line
regex iterators hold ref count to regex impl, fixes #1990
........
(In [46655]) regex iterators hold ref count to regex impl, fixes #1990