0

我编写这段代码是为了尝试理解其他一些较大代码中的一个更大问题,但是在第二次迭代中,主打印中的列表出现垃圾,我不太明白这里发生了什么。诚然,我倾向于打破指针,但在这里看起来很直接,有人有任何见解吗?

std::list<int *> myobjects;
const std::list<int *>& getMYObjects( void );

const std::list<int *>&
getMYObjects( void ) 
{
    return( myobjects );
} 

void fillMYObjects()
{
    int myints[]={15,36,7,17,20,39,4,1};

    for(int i=0;i<8;i++)
    {
        int *temp = &myints[i];
        myobjects.push_back(temp);
        std::cout << "list: " << *temp << std::endl;
        std::cout << "list: " << temp << std::endl;
    }
     std::cout << "listBack: " << *myobjects.back() << std::endl;

   for(std::list<int*>::iterator it=myobjects.begin(); it!=myobjects.end();++it)
   {
        std::cout << ' ' << **it << std::endl;
   } 
}

int main()
{
   fillMYObjects();

   std::list<int*> myobjects2 = getMYObjects();
   for(std::list<int*>::iterator it=myobjects2.begin(); it!=myobjects2.end();++it)
   {
        std::cout << ' ' << **it << std::endl;
   } 
}
4

3 回答 3

0

该变量myints是一个局部变量,一旦函数返回就会超出范围。那么列表中的指针会发生什么?将指向内存现在占用和覆盖的对象。

于 2014-03-14T19:46:43.477 回答
0

您指向的数字是本地的,因此在堆栈上。当您离开该功能时,它们会超出范围。所以你仍然指向正确的地址,但数据已经消失,地址被用于其他用途。

于 2014-03-14T19:49:54.393 回答
0

在 fillMyObject 函数结束时,myInts 数组被销毁,因为它在函数内部被声明。在这个块的末尾,在函数的末尾,数组不再存在,如果你想保留它的值,你需要存储值而不是地址。结束后他们将不再正确;)

于 2014-03-14T19:50:13.527 回答