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.