我有两个名为 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;}
对于这个问题所需的阅读量,我深表歉意。