0

我有两个名为 arrContainer 和 pArrContainer 的模板类。arrContainer 的行为很像向量类,基本上是动态数组的包装器,用于简化动态数组的内存管理,pArrContainer 的工作方式与 arrContainer 几乎相同,只是它用于指针的动态数组。这个想法是它会清除它用于动态数组的内存,以及清除数组中指针的内存。

此外,我有一个类 Board,代表棋盘游戏中的棋盘。它用来执行此操作的基本成员是 arrC_board,一个 arrContainer< pArrContainer< Tile< Piece>> > 其中 Tile 是用于表示板上每个图块的模板类,而 Piece 是用于表示板上各个图块的类木板。

此处描述了 Tile 的内部结构。由于它用于 Piece,因此 tmp 将是 Piece:

template <typename tmp>
class Tile
{
protected:
    ...
    tmp* tmp_occupant;
public:
    Tile();
    ~Tile();
    tmp* getOccupant() const {return tmp_occupant;}
    ...
};

董事会的内部结构如下所示:

template <typename tmp>
class Board
{
protected:
    arrContainer < pArrContainer < Tile < tmp > > > arrC_board;
    int i_rows;
    int i_columns;
public:
    //Creates a 0x0 board (No elements!)
    Board();
    //Creates a IxJ board (Row x Column)
    Board(int I, int J);
    //Deletes the memory inside of all the tiles as well.
    ~Board();
    tmp* getElement(int I, int J) const;
    ...
};

但是当我调用 Board 的 getElement 函数时:

template <typename tmp>
tmp* Board<tmp>::getElement(int I, int J) const
{
    if (I >= 0 && J >= 0 && I < i_rows && J < i_columns)
    {
        Piece* occupant = arrC_board[I][J]->getOccupant();
        return occupant;
    }
    else
        ....
}

并到达该Piece* occupant = arrC_board[I][J]->getOccupant();部分,getOccupant()返回正确的值,但 pArrContainer 的析构函数在值实际分配给之前被调用occupant

为什么是这样?

作为参考,已包含以下功能体:

pArrContainer 的重载下标运算符:

template <typename tmp>
tmp* pArrContainer<tmp>::operator[] (const int index)
{
    if (index >= size)
    {
        ...//this part isnt executed
    }
    else
        return heldArray[index];
}

arrContainer 的下标运算符看起来与 pArrContainer 的相同。瓷砖的getOccupant()作用:

tmp* getOccupant() const {return tmp_occupant;}

对于这个问题所需的阅读量,我深表歉意。

4

0 回答 0