2012-01-24 4 views
0

Когда я пытаюсь получить доступ к этому конкретному указателю, приложение аварийно завершает работу и показывает ошибку нарушения доступа c0000005.Сбой при нарушении доступа к C++

Как я могу уловить эту ошибку и не закрывать ее, как я бы в C# с помощью try catch &. Или как я могу проверить, запрещен ли доступ к этой области памяти, прежде чем использовать ее?

Пример:

MyClass** a = (MyClass**)(0x12345678); 
a[0]->b = 1; 

Я доступ к таблице указателей и установив значение одного из членов класса. Это работает, но проблема в том, что «0x12345678» не всегда имеет классы, загруженные в эту область. Адрес имеет значение, но он не указывает на правильную область памяти и не удерживает значение 0.

Имейте в виду, что это DLL, загружаемая в приложение, которое я больше не есть источник для. Итак, я пытаюсь установить параметры приложения динамически.

+0

* Поэтому я пытаюсь установить параметры приложения динамически. * Используйте Tools -> Options -> Settings вместо случайного ввода в память? –

+3

Не делайте этого. –

+0

: T они не являются параметрами, которые я позволяю пользователю изменять. Это в основном обновление одного из моих старых приложений. Редактирование: я не случайно записываю в память, я отменил базовую структуру классов, которые я использовал, и я получил настройку для изменения. Проблема в том, что указатель класса настроек иногда содержит значение мусора, указывающее на область, к которой у меня нет доступа. @Seth Carnegie Тогда что бы вы порекомендовали, чтобы получить правильные результаты. – John

ответ

2

Вы можете использовать Structured Exception Handling, чтобы уловить эти ошибки. В частности, фильтр для EXCEPTION_ACCESS_VIOLATION.

Просто убедитесь, что вы знаете, что вы делаете, когда вы проглатываете исключение: если ваш адрес мусора указывает на страницу защиты, вы можете увидеть описанное поведение here.

+0

Вы джентльмен и ученый. Для этого я предоставляю вам все, что я могу предложить. Для записи я использовал __try и __except. – John

+0

@John Спасибо, добрый сэр. –