gpt4 book ai didi

c++ - 通过引用传递给 STL 容器的对象的生命周期

转载 作者:太空狗 更新时间:2023-10-29 19:44:53 24 4
gpt4 key购买 nike

我是一名经验丰富的编码员,但对 STL 还是比较陌生,刚刚遇到这个问题:

据我所知,STL 容器并不意味着复制它们包含的对象,或以其他方式影响它们的生命周期,但在实验中我看到了不同的结果。

特别是字符串类,旨在在销毁时将其底层存储的第一个字符归零,如果它们在超出范围之前存储在容器中,则仍然可以访问。例如,请考虑以下示例:

使用命名空间标准;

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() 给出未定义的结果,因为内存被额外调用的重复分配踩踏了,但都返回了适当的存储字符串,没有失败。

我想知道为什么会发生这种情况,但除此之外,我很乐意知道我是否可以依赖任何旧对象发生的这种效果。

谢谢

最佳答案

As far as I'm aware, STL containers aren't meant to copy the objects which they contain

好吧,让我们就此打住。 STL 容器确实 经常复制它们的内容。他们在插入时复制它们,在自动或显式调整容器大小时复制它们,并在复制容器本身时复制它们。大量复制。

我不确定您是从哪里得知 STL 容器不复制其内容的。我能想到的唯一接近的是,如果您将指针插入 STL 容器,它会复制指针本身,而不是指向的数据。

此外,您的代码中没有任何引用,所以我对这个问题的标题指的是什么感到困惑。

关于c++ - 通过引用传递给 STL 容器的对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3550978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com