I’m an experienced coder, but am still relatively new to the STL, and have just come across this problem:
As far as I’m aware, STL containers aren’t meant to copy the objects which they contain, or otherwise affect their lifecycles, yet experimentally I’m seeing different results.
In particular, string classes, which are meant to zero out the first character of their underlying storage upon destruction, are still accessible if they are stored in a container before they go out of scope. For instance, consider the following example:
using namespace std;
queue<string> strQueue;
const char *genStr(int i)
{
ostringstream os;
os << "The number i is " << i;
strQueue.push(os.str());
return strQueue.back().data();
}
void useStr()
{
while(!strQueue.empty())
{
cout << strQueue.front() << endl;
strQueue.pop();
}
}
int main(int argc, char **argv)
{
for(int i = 0; i < 40; i++)
{
printf("Retval is: %s\n", genStr(i));
}
useStr();
return 0;
}
As the strings go out of scope when genStr() exits, I would expect the printf to just output “Retval is: “, or at the very least for the call to useStr() to give undefined results, as the memory was stomped on by the repeated allocations from the extra calls, yet both return the appropriate stored strings, without fail.
I’d like to know why this happens, but in lieu of that, I’d be happy just to know whether I can rely on this effect happening with any old object.
Thanks
Okay, let’s stop right there. STL containers do copy their contents, frequently. They copy them when they’re inserted, they copy them when the container is resized either automatically or explicitly, and they copy them when the container itself is copied. Lots and lots of copying.
I’m not sure where you got the idea that STL containers don’t copy their contents. The only thing that I can think of that’s even close is that if you insert a pointer into an STL container, it will copy the pointer itself but not the pointed-to data.
Also, there are no references involved in your code whatsoever, so I’m puzzled as to what the title of this question refers to.