0

我不确定要搜索什么来尝试找到我的答案,所以请将我重定向到任何相关文章,我提前道歉。

我真的是 C++ 新手,正在尝试制作一个 3x3 CLI Tile 游戏。我可以将 Tile 对象分配给 TileGame 构造函数中的私有指针数组,并查看它们具有有效的内存地址(或者我认为是这样)。我的问题是当我运行一个方法来尝试访问该数据时。看起来数组中的第一个元素有一个值,但其他元素看起来很奇怪。我敢肯定这是一件小事,但我不知道自己做错了什么。我也尝试过创建一个访问器方法,但这似乎只会使事情复杂化。

#include <iostream>
using namespace std;

class Tile
{
    private:
        int position;
        int tileID;
    public:
        Tile(int, int);
};

// tile constructor
Tile::Tile(int p, int id) : position(p), tileID(id) {}

class TileGame
{
    private:
        const int MAX_TILES;
        Tile* tiles[];
    public:
        TileGame();
        void shuffle();
};

// game constructor
TileGame::TileGame() : MAX_TILES(8)
{
    Tile* tiles[MAX_TILES];
    for (int i = 0; i < MAX_TILES; i++)
    {
        tiles[i] = new tile(i, i);
    }

    // spit out the addresses for each
    cout << endl << "From TileGame(): " << endl;
    for (int i = 0; i < MAX_TILES; i++)
    {
        cout << tiles[i] << endl;
    }
}

void TileGame::shuffle()
{
    // spit out the addresses for each
    cout << endl << "From TileGame(): " << endl;
    for (int i = 0; i < MAX_TILES; i++)
    {
        cout << tiles[i] << endl; // <-- This seems to be the problem
    }
}

int main()
{
    TileGame* game = new TileGame();
    game->shuffle();
}

这应该编译(我不得不重新输入它,所以我希望我没有犯错。)我得到的输出是这样的:

From TileGame():
0x7f9349c03aa0
0x7f9349c03ab0
0x7f9349c03ac0
0x7f9349c03ad0
0x7f9349c03ae0
0x7f9349c03af0
0x7f9349c03b00
0x7f9349c03b10

From shuffle():
0x7fff9502752c
0x100
0
0
0
0
0
0

当我通过尝试访问tiles[]值不断遇到段错误时,我到达了这一点。想法?

4

2 回答 2

4

您的构造函数没有做任何事情来初始化名为tiles;的成员。相反,它填充了一个同名的本地数组。当构造函数退出时,这将被丢弃,泄漏分配的内存。然后,当您尝试使用未初始化的成员时,您会得到未定义的行为(在您的情况下是分段错误)。

如果您在编译时不知道大小,则该成员应该是指针,而不是数组:

Tile ** tiles;

分配如下:

tiles = new Tile* [MAX_TILES];

记得在析构函数中删除每个 tile ( delete tiles[i]) 和数组本身 ( delete [] tiles);与往常一样,在自己管理资源时,请记住三法则

更好的是,使用std::vector这样您就不必自己管理内存。一般来说,在不需要的时候应该避免动态分配;例如,TileGame您在其中创建的main可能是一个自动变量 ( TileGame game;),以修复您那里的内存泄漏。

于 2012-09-06T17:23:57.133 回答
1

tiles在构造函数中创建的数组TileGame不是对象tiles中的数组Game。摆脱构造函数中的那个。

此外,也可以指针。tiles数组可以容纳Tile对象;不需要间接和news。同样,没有必要game成为一个指针。只需将其创建为TileGame对象即可。

于 2012-09-06T17:23:46.710 回答