0

私はこのコードを書いて、他の大きなコードの大きな問題を理解しようとしましたが、メインのリストの 2 回目の繰り返しでゴミが表示され、ここで何が起こっているのかよくわかりません。確かに、私はポインターを壊す傾向がありますが、ここでは簡単に見えますが、誰か洞察がありますか?

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

ローカルの数値を指しているため、スタック上にあります。関数を終了すると、それらはスコープ外になります。したがって、まだ正しいアドレスを指していますが、データはなくなり、アドレスは別の目的で使用されています。

于 2014-03-14T19:49:54.393 に答える
0

関数内で宣言された myInts 配列は、fillMyObject 関数の最後で破棄されます。このブロックの最後、関数の最後で、配列はもう存在しません。その値を保持したい場合は、アドレスではなく値を保存する必要があります。彼らは終わりの直後にはもう正しくないでしょう ;)

于 2014-03-14T19:50:13.527 に答える