这是一个非常奇怪的错误。我花了一些时间试图解决它,但我只是迷失了。
我有一个递归函数,实现了一种Minimax算法。 ChessBoard对象通过链接到前一个和下一个移动而实现到树中。但这不是问题所在。
因为整棵树占用了大量内存,所以我想实现类似于视频压缩的IFrame和PFrame设计的东西。每个电路板可以处于以下两种状态之一:IFrame
当它将所有部件的数组存储在它们的位置时(这将更快地分析电路板的位置),PFrame
是它只存储的时候前一个位置和它自身之间的差异(它应该在内存中占用更少的空间,假设只有4个单元格会改变,而且只有在进行转换时)。我有两种方法:
void ChessBoard::makeIFrame()
{
if(!board)
{
//++chessBoardArrayCreateCount;
board = new ChessPiece[param.cellCount];
std::copy(from->board, from->board+param.cellCount, board);
for(size_t i=0; i<4; ++i)
{
if(changes[i].pos==param.cellCount)
{
break;
}
board[changes[i].pos] = changes[i].piece;
}
}
}
void ChessBoard::makePFrame()
{
if(board)
{
//++chessBoardArrayDeleteCount;
delete[] board;
board=nullptr;
}
}
我可以确认已执行makePFrame
方法,但我可以看到它对适合内存的对象数没有影响。
我不确定这是否重要,但进行计算的过程是在一个单独的std::thread
中进行的,但是当从其他任何地方进行计算时,我从不操纵董事会的状态。