Исключение SEH с кодом 0xc0000005, брошенным в тестовое тело - программирование

Исключение SEH с кодом 0xc0000005, брошенным в тестовое тело

Я пишу тест с использованием GoogleTest для следующего класса, и я получаю вышеуказанную ошибку.

class Base
{
    // Other Functions;

    CSig objSig[50];
}

Класс CSig выглядит следующим образом:

class CSig
{
    //... constructor, destructor(empty) and some functions
    CMod *objMod;
    CDemod *objDemod;
}

CSig :: CSig
{
    bIsInitialised = false;

    for (int i=0; i<MAX_NUM; i++)
    {
        PStrokePrev[i] = 0.0;
    }
}

Однако, когда я отбрасываю CSig objSig[50], тесты работают нормально.

Что я могу сделать, чтобы решить эту проблему? Кроме того, мне нужно иметь CSig objSig[50] в базовом классе.

4b9b3361

Ответ 1

Исключение SEH (структурированное исключение) исключение не является исключением С++, которое может обрабатываться с использованием конструкторов языка С++ (try-catch), но оно создается из самих окон и указывает на некоторые фундаментальные недостатки. SEH-исключения очень раздражают, потому что они не приводят к нормальному отключению стека, что может привести к закрытым файлам или не разблокированным мьютексам, которые обычно очищаются деструкторами объекта-владельца. Я столкнулся с исключениями SEH при доступе к памяти, которая не относится к текущему процессу, поэтому я рекомендую посмотреть инструкции, связанные с памятью, в конструкторе и деструкторе CSig. Вы можете прочитать о SEH, например, здесь

Ответ 2

Как я понял, проблема в том, что в Visual Studio я пошел в Debug- > Exceptions и проверил все в первом столбце. Затем запустите/отлаживайте свои модульные тесты, и это вызовет исключение в строке, в которой находится проблема. Это где вам нужно отлаживать/исправлять его.

Ответ 3

Я столкнулся с этой проблемой, используя GoogleTest с Visual Studio 2010. Наша настройка включает в себя создание библиотеки для GoogleTest Framework, которая затем связана с нашими отдельными модульными тестами. Недавно я обновил поддержку Framework и перекомпилировал ее с нуля. После этого я столкнулся с описанным выше исключением.

После небольшого копания я обнаружил, что параметр "Struct Member Alignment" был виновником:

Свойства проектa > Свойства конфигурации > C/С++ > Генерация кодa > Выравнивание элементов структуры

В то время как проект Frameworks имел настройку "default", соответствующий проект Unit Test имел настройку "1 байт /Zp 1". Как только я изменил их, чтобы иметь одинаковое выравнивание, проблема исчезла.

Ответ 4

Для меня это оказалось пустой ссылкой ошибка. Некоторый метод был вызван на nullptr, и по причинам, непонятным для меня, он не сразу сработал, а только начал выполняться. Вероятно, ошибка SEH произошла, как только была открыта незанятая память. Поэтому проверьте нулевые указатели!

Ответ 5

У меня есть аналогичная проблема, и она относится к неинициализированным переменным и запускает тест в сборке релизов. У меня был char * un-initialized, после которого инициализировано значение NULL, похоже, исправлено.

Ответ 6

Если вы используете Visual Studio 2013, установите флажок "Бросок" для исключений Win32 (в частности, нарушение прав доступа) в "Отладка" > "Исключения". Это позволит вам отладить, какая строка имеет проблему. Это может быть полезно, поскольку отладчик не будет ломаться, если ваша программа обычно вызывает другие исключения.