如果我在堆栈上创建一个对象并将其推送到列表中,那么该对象将失去作用域(在下面示例中的 for 循环之外)该对象是否仍存在于列表中?如果列表仍然包含该对象,那么该数据现在是否无效/可能已损坏?

请让我知道,并请解释推理..

谢谢,
吉布

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 呢?而不是列表......在那种情况下它会无效吗?

最佳答案

所有容器都会复制它们存储的内容。如果要在容器中使用,则要求对象是可复制构造和可分配的。

所以是的, vectorlist 等都制作了您的对象的拷贝。

一个更短的例子:

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.

关于C++ 堆栈内存仍然有效吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2656551/

10-11 18:27