Re: std::vector::operator[] throws exception
Deane Yang wrote:
{ for questions specific to VC++ please consider posting
to 'microsoft.public.vc.language' newsgroup. -mod }
James Kanze wrote:
Deane Yang wrote:
> I was surprised to learn recently that code like
> std::vector<int> v(3);
> v[3] = 10;
> compiled with VC++ 8.0 and the STL library that comes with it
> throws an exception when run.
> Does this conform to the official specification of std::vector?
> No exception is thrown if compiled with cygwin gcc.
I get a core dump with g++ under Linux or Solaris. At least
with debug options turned on.
First, I misspoke, and this is not so different from VC++ does. To be
precise, VC++ invokes an "invalid parameter handler", which by default
terminates the program. There is no exception thrown.
But what is different is that VC++ does this even with programs compiled
in release mode. Can someone explain to me why this is desirable default
behavior?
This is desirable because it catches the error at the earliest
opportunity. The alternative is to allow you to overwrite random memory
beyond the end of the vector. Depending on its current size and on the
current heap layout, this has the potential of corrupting the heap
slightly. This, in turn, is likely to lead to very hard to reproduce
errors at some later point when the heap manager tries to do something
with the corrupted structure. Another possibility (if the heap doesn't
have a block header) is to overwrite the beginning of a heap allocated
object, which will also lead to random errors that would be impossible
to reproduce.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]