The program crashes: Segmentation fault
This family of problem is extremely large and contains two main sort of errors: access to non-authorized part of the memory and system calls with incorrect parameter values.
Unauthorized memory access
It when you try to read or write to a memory address
1. totally meaningless (for instance a non-initialized pointer)
2. out of bounds
3. not allocated anymore
Note that a memory access with an unitialized pointer may corrupt the memory
without actually crashing the program. For instance
#include <iostream>
int main(int argc, char **argv) {
int b;
int a[10];
b = 4;
for(int i = 0; i < 100; i++) {
a[i] = 12;
cout << b << " "; cout.flush();
}
}
displays
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
Segmentation fault
First, the loop fills the a array, then it erases b (which is just after a in the
memory) but the program still does not crash because the operating system
has allocated a minimum amount of memory larger than what is specified in
the source code. When the counter leaves the allocated area, the CPU tries to
access a non-authorized part and the operating system kills it.
Such errors can be extremely tricky, since an incorrect memory access can crash
the program after a while
#include <iostream>
int main(int argc, char **argv) {
int *b;
int a[10];
b = new int[10];
for(int i = 0; i < 20; i++) a[i] = 12;
cout << "We are here!\n";
b[2] = 13; // kaboom
}
prints out
We are here!
Segmentation fault
Here b was correctly initialized, then erased by an out-of-bound access of array
a, and the crash occurs when then not-anymore correct value of b is used.
Incorrect system call
The second case occurs when you use a system call with wrong parameter values.
It can be explicit (for instance the UNIX fclose with a non-initialized value) or
implicit through the C++ memory allocation / deallocation system (for instance
if you delete[] the same array twice)
#include <iostream>
int main(int argc, char **argv) {
int *b = new int[123];
delete[] b;
delete[] b; // kaboom
}
The program crashes: Floating point exception
This happens when you try a division by 0 with integer numbers. Note that
the floating-point types are extremely tolerant to meaningless operations. Since
those types can carry values such as nan, inf and -inf, computating values
such as logarithm of negative numbers, square root of negative numbers and
inverse of 0 will not crash the program (but will most of the time lead to a
wrong result).