Я полагаю, что следующая программа должна либо жаловаться, что она не может скомпилировать регулярное выражение, либо обращаться с ним как с допустимым и скомпилировать его нормально (у меня нет стандарта, поэтому я не могу точно сказать, является ли выражение строго законным; возможны разумные толкования). Во всяком случае, что происходит с g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
в том, что при запуске он сильно падает
*** Error in `./a.out': free(): invalid next size (fast): 0x08b51248 ***
в кишках библиотеки.
Вопросы:
а) это ошибка, верно? Я предполагаю (возможно неправильно), что стандарт не говорит, что std :: regex может потерпеть крах, если ему не нравится синтаксис. (MSVC ест это хорошо, FWIW)
б) если это ошибка, есть ли какой-нибудь простой способ узнать, о ней сообщалось или нет (мое первое знакомство с системами ошибок в gnu-land было пугающим)?
#include <iostream>
#include <regex>
int main(void)
{
const char* Pattern = "^(%%)|";
std::regex Machine;
try {
Machine = Pattern;
}
catch(std::regex_error e)
{
std::cerr << "regex could not compile pattern: "<< Pattern << "\n"<< e.what() << std::endl;
throw;
}
return 0;
}
Я бы поставил это в комментарии, но не могу, так что …
Я не знаю, знаете ли вы, но это похоже на трубу | характер в конце, который вызывает ваши проблемы. Кажется, что символьное представление | последний символ (поскольку «^ (%%) | a» отлично работает для меня), заданный g ++, создает беспорядок, когда regex пытается вызвать free ();
Стандарт (или, по крайней мере, онлайн-проект, который я читаю) утверждает, что:
28.8
Class template basic_regex
[re.regex]
1 For a char-like type charT, specializations of class template basic_regex represent regular expressions
constructed from character sequences of charT characters. In the rest of 28.8, charT denotes a given char-
like type. Storage for a regular expression is allocated and freed as necessary by the member functions of
class basic_regex.
2 Objects of type specialization of basic_regex are responsible for converting the sequence of charT objects
to an internal representation. It is not specified what form this representation takes, nor how it is accessed by
algorithms that operate on regular expressions.
[ Note: Implementations will typically declare some function
templates as friends of basic_regex to achieve this — end note ]
и позже,
basic_regex& operator=(const charT* ptr);
3 Requires: ptr shall not be a null pointer.
4 Effects: returns assign(ptr).
Так что, если g ++ не думает, что const char * Pattern = «|»; является нулевым ptr (я бы не подумал …),
Я думаю, это ошибка?
РЕДАКТИРОВАТЬ: Между прочим, подряд || (даже когда не в конце), кажется, вызывает ошибку сегментации для меня тоже.
Других решений пока нет …