Как поймать исключение нулевого указателя? [дубликат]

Я не уверен, что вы подразумеваете под:

Я хотел бы разбить массив байтов в определенной точке (индекс) без необходимости просто создавать новый массив байтов и копировать каждый байт одновременно увеличивая отпечаток в памяти операции.

В большинстве языков, конечно же, C #, после выделения массива невозможно изменить его размер. Похоже, вы ищете способ изменить длину массива, что вы не можете. Вы также хотите каким-то образом перезапустить память для второй части массива, чтобы создать второй массив, чего вы также не можете сделать.

В итоге: просто создайте новый массив.

41
задан 0xC0DEFACE 1 December 2009 в 03:02
поделиться

7 ответов

В C ++ не существует такой вещи, как «исключение нулевого указателя». Единственные исключения, которые вы можете поймать, - это исключения, явно генерируемые выражениями throw (плюс, как заметил Павел, некоторые стандартные исключения C ++, генерируемые внутренне стандартным оператором new , dynamic_cast и т. Д.). В C ++ нет других исключений. Разыменование нулевых указателей, деление на ноль и т. Д. Не генерирует исключений в C ++, оно приводит к неопределенному поведению . Если вы хотите, чтобы исключения генерировались в таких случаях, вы должны вручную определять эти условия и явно вызывать throw . Вот как это работает в C ++.

Все, что вы, кажется, ищете, имеет отношение к языку C ++, а скорее является особенностью конкретной реализации.

57
ответ дан 27 November 2019 в 00:17
поделиться

Вы не можете. Отмена ссылки на нулевой указатель - это системная вещь.

В Linux ОС генерирует сигналы в вашем приложении. Взгляните на csignal , чтобы узнать, как обрабатывать сигналы. Чтобы «поймать» один, вы должны подключить функцию, которая будет вызываться в случае SIGSEGV . Здесь вы можете попытаться вывести некоторую информацию, прежде чем корректно завершить программу.

Windows использует структурированную обработку исключений . Вы можете использовать instristics __ try / __ except , как указано в предыдущей ссылке. В одной из написанных мною утилит отладки я сделал это с помощью функции _set_se_translator (потому что она очень похожа на хуки). В Visual Studio убедитесь, что у вас включен SEH. С помощью этой функции вы можете подключить функцию для вызова, когда система вызывает исключение в вашем приложении; в вашем случае он будет вызывать его с помощью EXCEPTION_ACCESS_VIOLATION . Затем вы можете создать исключение и заставить его распространяться обратно, как если бы исключение было сгенерировано в первую очередь.

25
ответ дан 27 November 2019 в 00:17
поделиться

Разыменование нуля (или указателя, который находится за концом массива, или случайного недопустимого указателя) приводит к неопределенному поведению. Нет портативного способа "поймать" это.

9
ответ дан 27 November 2019 в 00:17
поделиться

C ++ не выполняет проверку указателей (хотя я полагаю, что некоторые реализации могли бы). Если вы попытаетесь записать в нулевой указатель, скорее всего, произойдет сбой. Это не вызовет исключения. Если вы хотите это уловить, вам нужно самостоятельно проверить значение указателя, прежде чем пытаться писать в него.

5
ответ дан 27 November 2019 в 00:17
поделиться

Как говорили другие, вы не можете сделать это в C ++.

Если я могу сделать более широкий вывод: даже на языке, который позволяет вам это уловить, лучшее действие - не трогать нулевые указатели. Поймать ошибку, когда она уже взорвана вам в лицо, а затем решить просто двигаться дальше, как будто этого не произошло, - не лучшая стратегия кодирования. Такие вещи, как разыменование нулевого указателя, переполнение стека и т. Д., Следует рассматривать как катастрофические события и избегать их в целях защиты, даже если ваш язык позволяет вам реагировать на них по-другому.

2
ответ дан 27 November 2019 в 00:17
поделиться

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

Неисправное приложение может нанести гораздо больший ущерб, чем разбившееся. Мой совет - дать ему сбой, а затем исправить причину сбоя. Промыть. Повторить.

3
ответ дан 27 November 2019 в 00:17
поделиться

Нет независимого от платформы способа сделать это. В Windows / MSVC ++ вы можете использовать __ try / __ except

Но я бы все равно не рекомендовал это делать. Вы почти наверняка не сможете правильно восстановиться после ошибки сегментации.

1
ответ дан 27 November 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: