четверг, 8 декабря 2011 г.

Почему не приходит сигнал об ошибке при delete невалидного указателя?

При освобождении одного и того же указателя дважды мы можем получить ошибку доступа к памяти (SIGSEGV), а можем и не получить её. Как я выяснил, это в основном зависит от везения.
Например, может оказаться, что указатель, по которому вы освобождаете память, указывает на область памяти, которая уже была заново выделена вашим процессом в каком-то другом месте. И теперь вы снова освободили свою память. Разумеется в этом случае вы повреждаете собственные данные, дальнейшее поведение программы может быть непредсказуемым.

Но если область памяти, на которую указывает ваш освобождённый указатель была занята другим процессом. То при вашей попытке освободить эту память вы должны получить от операционной системы сигнал SIGSEGV (сигнал ошибки доступа к памяти).

Так например пример ниже не всегда даёт ошибку доступа к памяти. Что, конечно, очень неприятно.
int main(int argc, char *argv[])
{
    int *a = new int(5);
    delete a;
    delete a;

    return 0;
}
Очень много интересной информации об этом можно прочитать в этом FAQ-листе:
http://www.parashift.com/c++-faq-lite/freestore-mgmt.html

Но иногда ошибка доступа к памяти всё таки происходит, и хотя бы в эти моменты будет полезным её перехватить.
Перейти к "Перехват сообщений SIGSEGV (Segmentation Fault) и SIGFPE (Floating point exception)"

1 комментарий: