Find the cause of a segmentation fault in:
vector<grade>::iterator front = student_grades(sr1).begin(); vector<grade>::iterator end = student_grades(sr1).end(); while ( front != end ) { if ( is_numeric_grade( *front ) ) ... front++; }
The vector returned by student_grades(sr1)
is a temporary object, whose lifetime ends when
the enclosing
full
expression
has been evaluated.
Thus front
is an iterator that points into
a vector that no longer exists.
Similarly end
is an iterator that points
into a different vector that no longer exists.
In effect, both front
and end
are dangling pointers.
The solution is to extend the lifetime of the vector that is
returned by student_grades
. One way to do that
is to store it into a local variable:
{ vector<grade> temp = student_grades(sr1); vector<grade>::iterator front = temp.begin(); vector<grade>::iterator end = temp.end(); while ( front != end ) { if ( is_numeric_grade( *front ) ) ... front++; } }
Last updated 3 December 1997.