Tuesday, March 18, 2008

Alias can be a tricky problem in C++'s STL vector

(Mar 14, 2008)

Alias can be a tricky problem in C++'s STL vector.

Sometimes, I don't want to write an awkward code such as willFail.m_vecProblematic[0] all the time, so I create an alias (prob1 in this example). This alias will work fine until we push or pop elements in a vector to a certain number and the vector is needed to reallocate.

Problematic* prob1 = &( willFail.m_vecProblematic[0] );
prob1->m_vec2.push_back( 55 );
prob1->m_vec1.push_back( 11111 );

// Push an element to a vector may cause a vector to reallocate.
willFail.m_vecProblematic.push_back( Problematic );

// prob1 may not point to a correct storage, but this value assignment

// may not cause a program to crash instantly.
prob1->i = 24;

// prob1 may not point to a correct storage, and such object

// operation usually cause a program to crash
prob1->m_vec2.push_back( 66 );

Note: simple value assignment to an invalid place may not cause a program to crash so easily, but calling a method from an invalid object pointer will cause a program to crash very easily since the method table of an object is already messed up. If we want to find where a program goes wrong, we may try to call a method of a suspecious object pointer.

No comments: