use*_*027 1 c++ memory recursion stack memory-management
我使用递归算法在c ++中实现了一个国际象棋机器人,该程序每次移动评估超过一百万个节点.
随着时间的推移,它占用的内存超过1 GIG的RAM ......
但我真的不需要在完成移动后先前声明的变量......
那么如何手动刷新堆栈内存以摆脱堆栈上先前声明的变量,就像java的垃圾收集器一样?
我发现我的来源中有这一行:
Move * M = new Move(x1,y1,x2,y2);
pair <Move *, Piece *> pr (M,aPiece);
Run Code Online (Sandbox Code Playgroud)
并且它在执行移动函数中,在递归中被称为百万次...
我的问题是,一旦完成所有递归并且我不再需要这个变量,你将如何清除这样的变量,但是当递归正在做它的事情时,我需要该变量留在内存中?
一旦它所驻留的函数调用返回,就会回收基于堆栈的存储.
您是否有可能new在递归函数中使用堆分配的内存(即调用)?或者,如果您只是查看Windows任务管理器或等效项,您可能会看到"峰值"使用情况,或者看到程序释放的内存与返回到操作系统内存池之间存在一些延迟.
跟进(问题编辑后):
目前还不清楚你在做什么pair<Move*, Piece*>,所以我无法判断Move对象是否需要由指针保持.通过指针保存它们的主要原因是多态(这里没有使用,因为你似乎没有创建子类对象)并允许它们的生命周期独立于调用堆栈.听起来你也没有这个理由.那么,为什么不呢:
std::pair<Move, Piece*> pr(Move(x1,y1,x2,y2), aPiece);
Run Code Online (Sandbox Code Playgroud)