Ошибка сегментации - это особая ошибка, возникающая из-за доступа к памяти, которая «не принадлежит вам». Это вспомогательный механизм, который удерживает вас от повреждения памяти и внесения трудных для отладки ошибок памяти. Всякий раз, когда вы получаете segfault, вы знаете, что делаете что-то не так с памятью - обращаетесь к переменной, которая уже была освобождена, записываете в доступную только для чтения часть памяти и т. Д. Ошибка сегментации практически одинакова в большинстве языков, которые позволяют вам связываться с В управлении памятью нет принципиальной разницы между ошибками в C и C ++.
Есть много способов получить segfault, по крайней мере, на языках более низкого уровня, таких как C (++). Распространенный способ получить segfault - разыменовать нулевой указатель:
int *p = NULL;
*p = 1;
Другая ошибка возникает, когда вы пытаетесь записать часть памяти, помеченную как доступную только для чтения:
char *str = "Foo"; // Compiler marks the constant string as read-only
*str = 'b'; // Which means this is illegal and results in a segfault
Свисающий указатель указывает на то, что больше не существует, как здесь:
char *p = NULL;
{
char c;
p = &c;
}
// Now p is dangling
Указатель p
болтается, потому что он указывает на символьную переменную c
, которая перестала существовать после окончания блока. И когда вы попытаетесь разыменовать висячий указатель (например, *p='A'
), вы, вероятно, получите segfault.