Я не уверен, что вы подразумеваете под:
Я хотел бы разбить массив байтов в определенной точке (индекс) без необходимости просто создавать новый массив байтов и копировать каждый байт одновременно увеличивая отпечаток в памяти операции.
В большинстве языков, конечно же, C #, после выделения массива невозможно изменить его размер. Похоже, вы ищете способ изменить длину массива, что вы не можете. Вы также хотите каким-то образом перезапустить память для второй части массива, чтобы создать второй массив, чего вы также не можете сделать.
В итоге: просто создайте новый массив.
В C ++ не существует такой вещи, как «исключение нулевого указателя». Единственные исключения, которые вы можете поймать, - это исключения, явно генерируемые выражениями throw
(плюс, как заметил Павел, некоторые стандартные исключения C ++, генерируемые внутренне стандартным оператором new
, dynamic_cast
и т. Д.). В C ++ нет других исключений. Разыменование нулевых указателей, деление на ноль и т. Д. Не генерирует исключений в C ++, оно приводит к неопределенному поведению . Если вы хотите, чтобы исключения генерировались в таких случаях, вы должны вручную определять эти условия и явно вызывать throw
. Вот как это работает в C ++.
Все, что вы, кажется, ищете, имеет отношение к языку C ++, а скорее является особенностью конкретной реализации.
Вы не можете. Отмена ссылки на нулевой указатель - это системная вещь.
В Linux ОС генерирует сигналы в вашем приложении. Взгляните на csignal , чтобы узнать, как обрабатывать сигналы. Чтобы «поймать» один, вы должны подключить функцию, которая будет вызываться в случае SIGSEGV
. Здесь вы можете попытаться вывести некоторую информацию, прежде чем корректно завершить программу.
Windows использует структурированную обработку исключений . Вы можете использовать instristics __ try / __ except
, как указано в предыдущей ссылке. В одной из написанных мною утилит отладки я сделал это с помощью функции _set_se_translator
(потому что она очень похожа на хуки). В Visual Studio убедитесь, что у вас включен SEH. С помощью этой функции вы можете подключить функцию для вызова, когда система вызывает исключение в вашем приложении; в вашем случае он будет вызывать его с помощью EXCEPTION_ACCESS_VIOLATION
. Затем вы можете создать исключение и заставить его распространяться обратно, как если бы исключение было сгенерировано в первую очередь.
Разыменование нуля (или указателя, который находится за концом массива, или случайного недопустимого указателя) приводит к неопределенному поведению. Нет портативного способа "поймать" это.
C ++ не выполняет проверку указателей (хотя я полагаю, что некоторые реализации могли бы). Если вы попытаетесь записать в нулевой указатель, скорее всего, произойдет сбой. Это не вызовет исключения. Если вы хотите это уловить, вам нужно самостоятельно проверить значение указателя, прежде чем пытаться писать в него.
Как говорили другие, вы не можете сделать это в C ++.
Если я могу сделать более широкий вывод: даже на языке, который позволяет вам это уловить, лучшее действие - не трогать нулевые указатели. Поймать ошибку, когда она уже взорвана вам в лицо, а затем решить просто двигаться дальше, как будто этого не произошло, - не лучшая стратегия кодирования. Такие вещи, как разыменование нулевого указателя, переполнение стека и т. Д., Следует рассматривать как катастрофические события и избегать их в целях защиты, даже если ваш язык позволяет вам реагировать на них по-другому.
Обычно нельзя. Даже если бы вы могли это сделать, это было бы похоже на попытку наложить пластырь на подводную лодку, в которой произошла утечка.
Неисправное приложение может нанести гораздо больший ущерб, чем разбившееся. Мой совет - дать ему сбой, а затем исправить причину сбоя. Промыть. Повторить.
Нет независимого от платформы способа сделать это. В Windows / MSVC ++ вы можете использовать __ try / __ except
Но я бы все равно не рекомендовал это делать. Вы почти наверняка не сможете правильно восстановиться после ошибки сегментации.