try catch не может обработать ошибку сегментации внутри pthread - PullRequest
0 голосов
/ 14 января 2019

Здесь cdp - это пакет, в котором есть несколько векторов. При обращении к векторам возникает ошибка сегментации. (Доступ к векторам в его границах, я дважды проверил это). Я планировал обработать это исключение с помощью try catch, но оно не работает.

Следующая строка вызывает проблему в соответствии с GDB.

int firing_crash=cdp->firing_data[0].size();

Вот функция:

bool modified_simplex_solver::check_for_corrupt_cdp(converted_data_pack* cdp)
{
    try{
        int firing_crash=cdp->firing_data[0].size();
        int not_firing_crash=cdp->not_firing_data[0].size();
        return false;
    }
    catch(...)
    {   return true;}
}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Код в вопросе использует исключения для управления потоком. Это вещь Java; в С ++ это не одобряется. Способ сделать это в C ++ (и в Java, также) состоит в том, чтобы проверить, существуют ли данные:

return firing_data.empty() || not_firing_data.empty();
0 голосов
/ 14 января 2019

Вместо использования operator[] (который не выполняет проверку границ) и приведет к неопределенному поведению, если вектор не имеет элемента с указанным индексом, вы можете использовать функцию-член at().

at( size_type pos );

Эта функция:

  • Возвращает ссылку на элемент в указанном месте pos с проверкой границ .

  • Если pos находится вне диапазона контейнера, выдается исключение типа std::out_of_range .

Поскольку исключение выдается с at(), вы можете catch его.

Использование в вашем случае будет:

int firing_crash=cdp->firing_data.at(0).size();
...