我是一名经验丰富的程序员,但对STL仍然比较新,最近遇到了这个问题:
据我所知,STL容器不应该复制它们包含的对象,或者以其他方式影响它们的生命周期,但实验结果却不同。
特别是,字符串类在销毁时应将其底层存储的第一个字符清零,但如果它们在超出作用域之前存储在容器中,则仍然可以访问。例如,请考虑以下示例:
使用命名空间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;
}
当genStr()退出时,由于字符串超出了范围,我期望printf只输出“Retval is:”,或者至少调用useStr()会产生未定义的结果,因为重复分配来自额外调用的内存已被覆盖,但两者都返回适当存储的字符串,毫无失败。
我想知道为什么会发生这种情况,但如果不能解释,我很乐意知道是否可以依靠任何旧对象发生这种效果。
谢谢