I have a method as follows (from a class than implements TBB task interface - not currently multithreading though) My problem is that two ways of accessing a vector are causing quite different behaviour - one works and the other causes the entire program to bomb out quite spectacularly (this is a plugin and normally a crash will be caught by the host - but this one takes out the host program as well! As I said quite spectacular)
void PtBranchAndBoundIterationOriginRunner::runOrigin(int origin, int time) const // NOTE: const method
{
BOOST_FOREACH(int accessMode, m_props->GetAccessModes())
{
// get a const reference to appropriate vector from member variable
// map<int, vector<double>> m_rowTotalsByAccessMode;
const vector<double>& rowTotalsForAccessMode = m_rowTotalsByAccessMode.find(accessMode)->second;
if (origin != 129) continue; // Additional debug constrain: I know that the vector only has one non-zero element at index 129
m_job->Write("size: " + ToString(rowTotalsForAccessMode.size()));
try {
// check for early return... i.e. nothing to do for this origin
if (!rowTotalsForAccessMode[origin]) continue; // <- this works
if (!rowTotalsForAccessMode.at(origin)) continue; // <- this crashes
} catch (...) {
m_job->Write("Caught an exception"); // but its not an exception
}
// do some other stuff
}
}
I hate not putting in well defined questions but at the moment my best phrasing is : "WTF?"
I'm compiling this with Intel C++ 11.0.074 [IA-32] using Microsoft (R) Visual Studio Version 9.0.21022.8 and my implementation of vector has
const_reference operator[](size_type _Pos) const
{ // subscript nonmutable sequence
#if _HAS_ITERATOR_DEBUGGING
if (size() <= _Pos)
{
_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
#endif /* _HAS_ITERATOR_DEBUGGING */
_SCL_SECURE_VALIDATE_RANGE(_Pos < size());
return (*(_Myfirst + _Pos));
}
(Iterator debugging is off - I'm pretty sure) and
const_reference at(size_type _Pos) const
{ // subscript nonmutable sequence with checking
if (size() <= _Pos)
_Xran();
return (*(begin() + _Pos));
}
So the only difference I can see is that at calls begin instead of simply using _Myfirst - but how could that possibly be causing such a huge difference in behaviour?
UPDATE:
The index is within range - the size is printed out as 377 and the index is constrained to 129.
The member variable has an entry corresponding to accessMode
The entire thing has been wrapped in the following to clarify @nikko suggestion:
map<int, vector<double>>::const_iterator it = m_rowTotalsByAccessMode.find(accessMode);
if (it != m_rowTotalsByAccessMode.end())
{
...
UPDATE I've upgraded my compiler to the latest version 11.1.065 and this is no longer happening. Looks like it was weirdness somewhere.