Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
#1

Необработанное исключение нарушение прав доступа - C++

12.07.2012, 10:13. Просмотров 1895. Ответов 6
Метки нет (Все метки)

Можно ли отловить исключение, которое потом выдает компилятор как "необработанное исключение нарушение прав доступа"
Если можно, то как?
Исключение возникает в многопоточном приложении, когда потоки обращаются к одному контейнеру.
Вот в этой функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
DWORD WINAPI NewThread::EntryPoint( void* pArguments )
{
    int a = 0;
    ThreadRecord tr;
    srand(100);
    do
    {
        //WaitForSingleObject( hListMutex, INFINITE );
        DWORD ThreadIdTemp = GetCurrentThreadId();
        
        tr.setthreadID(ThreadIdTemp);
        tr.setsomestr("sometext");
        try
        {
            mylist.push_back(tr);
        }
        catch (...)
        {           
            printf("Exception1");
        }
 
        try
        {
            if (mylist.size() > 0)
            {
                if (mylist.size() > secondNum || mylist.begin()->getthreadID() != ThreadIdTemp)
                {
                    mylist.erase(mylist.begin());
                }   
            }
        }
        catch (...)
        {
            printf("Exception2");
        }
 
        //ReleaseMutex( hListMutex);
 
        Sleep(getrandom(1, 10));
 
    }while(!_kbhit());
 
    return 0;
}
Данный код этого исключения не отлавливает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2012, 10:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Необработанное исключение нарушение прав доступа (C++):

Необработанное исключение: нарушение прав доступа при записи - C++
Есть функция ввода текста. Текст с неизвестным количеством и длиной строк. При отладке прерывается и выдает: "Необработанное...

Необработанное исключение. Нарушение прав доступа при чтении - C++
Ребят помогите. В общем есть программа, открывает один файл, ищет в нем последовательности, заменяет на другие. В консоли все прекрасно...

Необработанное исключение по адресу 0x008B94C5. 0xC0000005: нарушение прав доступа при чтении по - C++
Здравствуйте! Функция должна искать локальные минимумы массива. То есть это элементы,которые меньше своих соседей. Дело в том,что функция...

Необработанное исключение по адресу, нарушение прав доступа при записи по адресу - C++
вот само задание: Авиарейсы (номер рейса, пункт назначения, время вылета, дата вылета, стоимость билета, количество мест). Выбор по дате...

Необработанное исключение: "Нарушение прав доступа при записи" - C++
Подскажите в чём проблемма происходит ошибка при выполнение программы #include <iostream> #include <string> using namespace std; ...

Необработанное исключение: "Нарушение прав доступа при чтении" - C++
При выполнении тестов {input...output} появляется необработанное исключение по адресу 0x009577E1 в 1590.exe: 0xC0000005: нарушение прав...

6
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
12.07.2012, 10:20 #2
1: можно.
2: лучше сделать, чтоб такое не возникало.
0
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
12.07.2012, 16:07  [ТС] #3
Цитата Сообщение от villu Посмотреть сообщение
1: можно.
2: лучше сделать, чтоб такое не возникало.
И это все?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
12.07.2012, 16:09 #4
да. В том плане, что это исключение обрабатывает SEH, и способ может не поддерживаться каким-то компиляторами. Показать способ могу, но тут как раз тот вариант, когда он не нужен. Нужен грамотный контроль доступа к общим ресурсам.
0
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
12.07.2012, 16:51  [ТС] #5
Цитата Сообщение от villu Посмотреть сообщение
да. В том плане, что это исключение обрабатывает SEH, и способ может не поддерживаться каким-то компиляторами. Показать способ могу, но тут как раз тот вариант, когда он не нужен. Нужен грамотный контроль доступа к общим ресурсам.
Я пишу в Visual Studio 2010.
Пробовал __try __except, но компилятор ругается, что используются объекты с деструктором.
Попробуй заменить try catch на __try __except в моем коде.
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
12.07.2012, 17:20 #6
ok
10 студия должна скушать
Студии можно в настройках проекта, где Code Generation можно выставить Enable c++ Exceptions: With SEH Exceptions (/EHa) или как-то так. тогда ошибка будет ловиться catch(...), а чтоб получить больше инфы об ошибке нужно получить ее сведения.
смысл в том, чтоб указать системе другой обработчик для SEH
делается вызовом
C++
1
_set_se_translator
Ниже пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class SEH_exception: public std::exception {
 
    static void translator(unsigned int, EXCEPTION_POINTERS* ep) { // новая функция - обработчик
        throw SEH_exception(ep); // кидаем уже наше исключение
    }
    EXCEPTION_POINTERS* m_ep; // инфа, которая может быть потом полезна, Состояние регистров и все такое
    std::string m_what;
public:
    class install { // класс - инсталлятор. Его задача поставить обработчик SEH и вернуть оборатно старый при разрешении 
        _se_translator_function m_old;
    public:
        install() 
            :m_old( _set_se_translator(SEH_exception::translator) )  // устанавливает и сохраняем старый
        {}
        ~install() /*throw()*/ { 
            _set_se_translator(m_old);  // возвращаем взад.
        }
    };
public:
    SEH_exception(EXCEPTION_POINTERS* ep_) 
        :m_ep(ep_) 
    { // просто запишем номер кода в поток и сохраним в строке. в EXCEPTION_POINTERS* есть много другой ценной инфы.
        std::stringstream ss;
        ss << "Error #" << std::hex << m_ep->ExceptionRecord->ExceptionCode;
        m_what = ss.str();
    }
    virtual ~SEH_exception() /*throw()*/ {}
 
    const char * what() const /*throw()*/ { // тут, думаю понятно
        return m_what.c_str(); 
    }
 
};
пример использования:
C++
1
2
3
4
5
6
7
8
9
10
int main() {
    
    try {
        SEH_exception::install e; // ставим
        *(int *)(0) = 10; //нарушаем
    } catch (const std::exception &ex) { 
        std::cout << ex.what() << "\n"; // показываем Error #c0000005
    }
    return 0;
}
Но лучше такие ошибки не прятать и даже не пытаться ловить. Есть, конечно, задачи, где такое нужно, но за скрытие подобного я бы по рукам давал.
1
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
12.07.2012, 17:34  [ТС] #7
Цитата Сообщение от villu Посмотреть сообщение
Но лучше такие ошибки не прятать и даже не пытаться ловить. Есть, конечно, задачи, где такое нужно, но за скрытие подобного я бы по рукам давал.
Если раскомментировать //WaitForSingleObject( hListMutex, INFINITE ); и //ReleaseMutex( hListMutex);, то исключений не будет (в приведенном коде).
Это просто такая задача, использовать исключения.
0
12.07.2012, 17:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 17:34
Привет! Вот еще темы с ответами:

Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу - C++
Помогите, пожалуйста, исправит ошибку. Необработанное исключение по адресу 0x77D88E19 (ntdll.dll) в Lab11.exe: 0xC0000005: нарушение...

Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09 - C++
Необработанное исключение по адресу 0x00105FD7 в Динамические структуры.exe: 0xC0000005: нарушение прав доступа при чтении по адресу...

Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC - C++
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже число, но если убрать srand(time(0));,...

Необработанное исключение в "0x776315de" в "c++1.exe": 0xC0000005: Нарушение прав доступа при записи "0x40e000 - C++
Здравствуйте. Только начал работать с динамическим массивом, но не могу понять почему появляется эта ошибка. Работаю с библиотекой sfml....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru