простое регулярное выражение C ++ получило ошибку во время выполнения в OSX, но Windows - PullRequest
0 голосов
/ 26 декабря 2018

Это код:

#include <iostream>
#include <regex>
using namespace std;

int main() 
{
    string str = "hello_2019";
    regex pattern[2];
    memset(pattern, 0, sizeof(regex) * 2);
    pattern[0] = regex(".*_\\d+");
    pattern[1] = regex("[a-z]+_.*");
    for (int i = 0; i < 2; i++)
        cout << regex_match(str, pattern[i]) << endl;
    return 1;
}

enter image description here

Но тот же код в OSX не может быть запущен:

enter image description here

Даже с помощью g ++ можно скомпилировать его, это приводит к ошибке времени выполнения.

g++ main.cpp
./a.out

1 11669 ошибка сегментации./a.out

1 Ответ

0 голосов
/ 26 декабря 2018

Эта строка:

memset(pattern, 0, sizeof(regex) * 2);

повреждает каждый из regex объектов в массиве pattern.

Не используйте memset для инициализации не POD-объектов, таких как regex.Использование memset здесь приводит к неопределенному поведению .

Самое простое решение - просто удалить эту строку.Сам массив автоматически по умолчанию инициализирует записи regex, поэтому нет необходимости (ошибочно) пытаться "инициализировать нулем" объект regex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...