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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
12.07.2012, 10:13     Необработанное исключение нарушение прав доступа #1
Можно ли отловить исключение, которое потом выдает компилятор как "необработанное исключение нарушение прав доступа"
Если можно, то как?
Исключение возникает в многопоточном приложении, когда потоки обращаются к одному контейнеру.
Вот в этой функции:
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;
}
Данный код этого исключения не отлавливает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2012, 10:13     Необработанное исключение нарушение прав доступа
Посмотрите здесь:

C++ Переворот строки. Необработанное исключение. Нарушения прав доступа
C++ Необработанное исключение. Нарушение прав доступа при чтении
C++ Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC
C++ Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09
Исключение Нарушение прав доступа при чтении C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
12.07.2012, 10:20     Необработанное исключение нарушение прав доступа #2
1: можно.
2: лучше сделать, чтоб такое не возникало.
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
12.07.2012, 16:07  [ТС]     Необработанное исключение нарушение прав доступа #3
Цитата Сообщение от villu Посмотреть сообщение
1: можно.
2: лучше сделать, чтоб такое не возникало.
И это все?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
12.07.2012, 16:09     Необработанное исключение нарушение прав доступа #4
да. В том плане, что это исключение обрабатывает SEH, и способ может не поддерживаться каким-то компиляторами. Показать способ могу, но тут как раз тот вариант, когда он не нужен. Нужен грамотный контроль доступа к общим ресурсам.
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 в моем коде.
villu
202 / 202 / 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;
}
Но лучше такие ошибки не прятать и даже не пытаться ловить. Есть, конечно, задачи, где такое нужно, но за скрытие подобного я бы по рукам давал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 17:34     Необработанное исключение нарушение прав доступа
Еще ссылки по теме:

Необработанное исключение: нарушение прав доступа при записи C++
C++ Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу
Необработанное исключение по адресу, нарушение прав доступа при записи по адресу C++

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

Или воспользуйтесь поиском по форуму:
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
12.07.2012, 17:34  [ТС]     Необработанное исключение нарушение прав доступа #7
Цитата Сообщение от villu Посмотреть сообщение
Но лучше такие ошибки не прятать и даже не пытаться ловить. Есть, конечно, задачи, где такое нужно, но за скрытие подобного я бы по рукам давал.
Если раскомментировать //WaitForSingleObject( hListMutex, INFINITE ); и //ReleaseMutex( hListMutex);, то исключений не будет (в приведенном коде).
Это просто такая задача, использовать исключения.
Yandex
Объявления
12.07.2012, 17:34     Необработанное исключение нарушение прав доступа
Ответ Создать тему
Опции темы

Текущее время: 13:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru