如果我在堆栈上创建一个对象并将其推入列表,那么该对象将失去作用域(在下面的示例中,for循环之外)该对象是否仍然存在于列表中?如果列表仍然保存对象,那么该数据现在是无效/可能已损坏吗?
请告诉我,请解释理由..
谢谢, JBU
class SomeObject{
public:
AnotherObject x;
}
//And then...
void someMethod()
{
std::list<SomeObject> my_list;
for(int i = 0; i < SOME_NUMBER; i++)
{
SomeObject tmp;
my_list.push_back(tmp);
//after the for loop iteration, tmp loses scope
}
my_list.front(); //at this point will my_list be full of valid SomeObjects or will the SomeObjects no longer be valid, even if they still point to dirty data
}
编辑:那如果是std::list<SomeObject*> my_list
怎么办?而不是列表...在这种情况下它会无效吗?
答案 0 :(得分:6)
标准容器制作对象的副本,因此在您的示例中列表仍然可以。
答案 1 :(得分:4)
所有容器都会复制它们存储的内容。如果要在容器中使用对象,则要求对象是可复制构造和可分配的。
是的,vector
,list
等等都会复制您的对象。
一个更短的例子:
struct foo {};
std::vector<foo> v;
v.push_back(foo());
// makes a copy of the temporary, which dies at the semicolon.
如果没有复制,上面的代码就不好了。
以下代码不确定:
struct foo {};
std::vector<foo*> v;
{
foo f;
v.push_back(&f); // fine, but...
} // ...now f stops existing and...
v.front(); // ...points to a non-existent object.
答案 2 :(得分:2)
是的,这是有效的。 push_back
生成copy。
答案 3 :(得分:0)
对于所有STL容器(列表,向量,映射,所有内容),容器会复制您添加到容器中的内容,因此,只要您添加的内容不是指针或引用,您就是安全的。
如果你自己编写容器,你必须要小心你的工作方式,因为没有什么可以阻止你编写一种存储引用的容器 - 对于那些认为它有用的人来说这只会是一个令人讨厌的惊喜像一个标准的容器。