Am Donnerstag, 9. November 2006 13:43 schrieb Ozgur Ugras BARAN:
> On 11/9/06, Georg Baum <[EMAIL PROTECTED]> wrote:
> > Ozgur Ugras BARAN wrote:
> >
> > > This patch solves the crash while calling Qt4-TOC dialog in
Linux /gcc-4.1
> >
> > Are you sure?
>
> I have tested here and it works now..
> >
> > The old code is perfectly valid for a std::map: if the element does not
> > exist it is created. I don't understand at all how using insert()
instead
> > of operator[] could solve a crash.
> >
> What I understand is map::operator[] returns mapped_type&, (for this
> case a const_iterator&).
Yes.
> When you use operator = you try to
> copy-construct with another const_iterator. This is erroneous, since
> you cannot dereference the first.
No, that is OK: I can assign a const_iterator to another const_iterator.
Otherwise the statement some lines above
TocIterator iter = toc.begin();
would not work.
> Pair, however, packs two items first.
>
> I guess this make sense, or just test it and see the result. )
>
> Anyway, I am not that sure. This may be a gcc bug also.
Yes, I think so: operator[] first default constructs a TocIterator if the
key is absent:
__i = insert(__i, value_type(__k, mapped_type()));
That default constructed iterator mapped_type() is singular, since it does
not point enywhere. Then in the value_type() constructor (value_type ==
std::pair) the copy constructor is called -> the singularity check fails.
The strange thing is that I could not reproduce the problem with this
little test program:
#define _GLIBCXX_CONCEPT_CHECKS 1
#define _GLIBCXX_DEBUG 1
#define _GLIBCXX_DEBUG_PEDANTIC 1
#include <map>
#include <string>
int main()
{
std::string s("hello");
std::string::const_iterator i = s.begin();
std::map<int, std::string::const_iterator> m;
m[500] = i;
return 0;
}
Georg