c++ std::map problem
Martin Voelkle
martin.voelkle@epfl.ch
Tue Aug 26 15:16:00 GMT 2003
Damn you're good!
Thank you, it now works exacly as I wanted.
I should have checked the contents of the map before asking.
Martin
Tony Wetmore wrote:
>The "problem" here appears to be that the first element is actually
>inserted with a key value of 1, rather than 0. This happens because the
>key parameter passed to std::map<>::operator[] is passed by reference,
>rather than by value (const key_type& __k).
>
>So, when you insert the first element into your map, the object is
>constructed, then nextid is incremented to 1. After this is done, the
>element is inserted, with a key value of 1, rather than 0.
>
>On the subsequent operator[] calls, nextid is set to 1, so it looks for
>an entry with a key of 1, and finds the first object that was created.
>
>Adding the additional call to the toto constructor increments the nextid
>by one, which causes the code to "work", although the objects are still
>inserted with the "wrong" (I believe) key value. That is, of course,
>assuming that in this code the key value should match the "id" of the
>toto object.
>
>If you print out the contents of the map after each call to
>toto::create(), you'll see the effect that I'm talking about.
>
>So this does not appear to be a bug in the C++ library, but rather an
>unfortunate side effect of the fact that the key type is passed by
>reference, rather than by value. And since, in your case, that key
>object changes value "midway" through the insertion, you get bad
>behavior.
>
>To fix the problem, you could store the current value of nextid in a
>temporary within toto::create() and use that in the map indexing
>operation instead:
>
> static const toto* create() { unsigned int n = nextid; return
>&totos[n]; }
>
>That causes the map to be created with key values that match the "id" of
>each object in the map, verified by printing out the map after each call
>to toto::create().
>
>---
>Tony Wetmore
>Raytheon Solipsys
>mailto:tony.wetmore@solipsys.com
>http://www.solipsys.com
>
>
>
>
>-----Original Message-----
>From: gcc-help-owner@gcc.gnu.org [mailto:gcc-help-owner@gcc.gnu.org] On
>Behalf Of Martin Voelkle
>Sent: Tuesday, August 26, 2003 10:03 AM
>To: gcc-help@gcc.gnu.org
>Subject: c++ std::map problem
>
>
>Hello,
>
>please cc me.
>
>I'm having trouble making this snip of code work. I just want to keep a
>map of created objects (for (un)marshalling), but when I run the
>attached code, I see that the constructor is only called once, giving an
>
>output of 0111.
>
>Now if I make this change:
>- static const toto* create() { return &totos[nextid]; }
>+ static const toto* create() { toto(); return &totos[nextid]; }
>I get 0246, which is what is expected, but not the initial objective.
>
>Am I doing something wrong? Is there a bug in g++ or libstdc++? I get
>the problem with both 3.3.2 20030812 and 2.95.4 20011002 (Debian sid) I
>don't know what kind of keywords I could use to search, so I have to
>post.
>
>Thank you,
>
>
>
More information about the Gcc-help
mailing list