C ++在作用域结束后丢失指针引用

时间:2011-05-06 16:19:02

标签: c++ pointers null-pointer

我得到一个非常奇怪的错误,在我离开for范围之后,即使在类头中声明了包含对象的数组,我也无法访问指针在循环期间指向的任何内容。 / p>

这是代码的基础:

Class CTile{ /*Code*/ };

Class CMap  
{  
    public:  
        CTile** tiles;  
        CMap();  
}

CMap::CMap()  
{  
    int lines = 10;
    int cols = 10;
    tiles = new CTile*[lines];  
    for(int i = 0 ; i (lower than) lines;++)  
    {  
        this->tiles[i] = new CTile[cols];  
    }  
    for(int curLine = 0; curLine (lower than) lines ; curLine++)  
        for(int curCol = 0; curCol (lower than) cols; curCol++)  
        {
            CTile me = this->tiles[curLine][curCol];
            me.setType(1);
            //do whatever I need, and inside the loop everything works.  
        }  
    int a = this->tiles[2][2].getType(); // a gets a really weird number 
    this->tiles[2][2].setType(10); // crashes the program

}

有谁知道可能出现什么问题?

2 个答案:

答案 0 :(得分:4)

CTile me = this->tiles[curLine][curCol];

那应该是

CTile& me = this->tiles[curLine][curCol];
me.setType(1);

为什么呢?因为您制作了CTile的副本,而不是创建对二维数组中的一个的引用。您现在可能会发现崩溃已移至me.setType(1)语句。

答案 1 :(得分:4)

CTile  me = this->tiles[curLine][curCol];

这是问题所在。 me是原始对象tiles[curLine][curCol]副本,因此无论您使用me做什么都不会反映在原始对象中。即使您执行me.setType(1),原始对象仍保持不变。我相信你不想那样。

所以修复是:使用引用:

CTile & me = this->tiles[curLine][curCol];
  //  ^ note this
me.setType(1);

或者更好的是,您可以这样做:

tiles[curLine][curCol].setType(1); //"this" is implicit!