Что такое ошибка времени выполнения SIGSEGV в C ++?

Мне нужно знать основную причину ошибки сегментации, а также может кто-нибудь сказать мне, как с ней справиться.

    В Википедии есть ответ, а также ряд других источников.

    Segfault в основном означает, что вы сделали что-то плохое с указателями. Это, вероятно, segfault:

    char *c = NULL; ... *c; // dereferencing a NULL pointer 

    Или это:

     char *c = "Hello"; ... c[10] = 'z'; // out of bounds, or in this case, writing into read-only memory 

    Или, может быть, это:

     char *c = new char[10]; ... delete [] c; ... c[2] = 'z'; // accessing freed memory 

    Один и тот же базовый принцип в каждом случае – вы делаете что-то с памятью, которая не принадлежит вам.

    Существуют различные причины сбоев сегментации, но в основном вы неправильно обращаетесь к памяти. Это может быть вызвано разыменованием нулевого указателя или попыткой изменить память в режиме readonly или с помощью указателя на то место, которое не отображается в пространство памяти вашего процесса (это, вероятно, означает, что вы пытаетесь использовать число в качестве указателя , или вы увеличили указатель слишком далеко). На некоторых машинах возможен неправильный доступ через указатель, чтобы вызвать проблему – если у вас есть нечетный адрес и, например, попытаться прочитать четное количество байтов из него (вместо этого можно создать SIGBUS).

    используя недопустимый / нулевой указатель? Переопределение границ массива? Kindof трудно быть конкретным без какого-либо образца кода.

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

    Вот пример SIGSEGV.

     [email protected]:/opt/playGround# cat test.c int main() { int * p ; * p = 0x1234; return 0 ; } [email protected]:/opt/playGround# g++ -o test test.c [email protected]:/opt/playGround# ./test Segmentation fault 

    И вот деталь .

    Как с этим справиться?

    1. Прежде всего, избегайте его.

      Защитите программу: используйте assert (), проверьте указатель NULL, проверьте переполнение буфера.

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

      скомпилируйте свой код с помощью -Werror -Wall.

      Кто-нибудь просматривает ваш код.

    2. Когда это произошло.

      Осмотрите внимательно код.

      Проверьте, что вы изменили с момента последнего успешного выполнения кода без сбоя.

      Надеюсь, gdb даст вам стек вызовов, чтобы вы знали, где произошел сбой.


    EDIT: извините за спешку. Он должен быть *p = 0x1234; вместо p = 0x1234 ;

    Interesting Posts

    Возможно ли определить местоположение файла при его запуске?

    Java Arrays.asList на примитивном типе массива создает неожиданный тип списка

    Есть ли программное обеспечение для Mac OSX, которое управляет запуском групп приложений?

    Компьютер не запускается после установки новой ОЗУ

    Компьютерный уход: спящий режим, спящий режим или выключение?

    как установить языковой стандарт по умолчанию для моей JVM?

    Создание SearchView, который выглядит как руководство по разработке материалов

    Должны ли службы всегда возвращать DTO или они могут также возвращать модели домена?

    Знаю ли я, нужен ли мне Multi-Dex? (ClassNotFoundException)

    Как найти размер int ?

    Почему пустая оптимизация базового classа не работает?

    Проверка строки для непечатаемых символов при чтении текстового файла

    WCF: Показывать только свойства DataMember без набора?

    Гиперссылка на другой рабочий лист с использованием функции гиперссылки в excel

    Как работают модуль и rand ()?

    Давайте будем гением компьютера.