清除c+中堆栈中分配的内存+; 我用递归算法在C++中实现了一个国际象棋机器人,程序对每个移动节点进行了一百万个节点的评估。
随着时间的推移,它占用的内存将超过1G 但我并不需要在我完成移动后声明的变量 那么,如何像java的垃圾收集器一样,手动刷新堆栈内存以清除堆栈上先前声明的变量呢 更新 我发现我的资料中有这样一行:清除c+中堆栈中分配的内存+; 我用递归算法在C++中实现了一个国际象棋机器人,程序对每个移动节点进行了一百万个节点的评估。,c++,memory,memory-management,recursion,stack,C++,Memory,Memory Management,Recursion,Stack,随着时间的推移,它占用的内存将超过1G 但我并不需要在我完成移动后声明的变量 那么,如何像java的垃圾收集器一样,手动刷新堆栈内存以清除堆栈上先前声明的变量呢 更新 我发现我的资料中有这样一行: Move * M = new Move(x1,y1,x2,y2); pair <Move *, Piece *> pr (M,aPiece); Move*M=新移动(x1,y1,x2,y2); 成对pr(M,每个); 它在执行移动函数中,在递归中被调用了一百万次 我的问题是,一旦所有
Move * M = new Move(x1,y1,x2,y2);
pair <Move *, Piece *> pr (M,aPiece);
Move*M=新移动(x1,y1,x2,y2);
成对pr(M,每个);
它在执行移动函数中,在递归中被调用了一百万次
我的问题是,一旦所有的递归都完成了,我不再需要这个变量,但是当递归完成它的工作时,我需要这个变量留在内存中,你怎么清除这个变量呢?你不需要-没有办法处理编译器实现的堆栈。您需要实现自己的堆栈,当然您可以随心所欲地使用它。基于堆栈的存储在其驻留的函数调用返回后立即被回收 是否可能在递归函数中使用了堆分配内存(即调用
new
)?或者,如果您只是查看Windows任务管理器或等效工具,您可能会看到“峰值”使用率,或者看到程序释放内存和返回操作系统内存池之间的延迟
跟进(问题编辑后):
不清楚您正在使用对执行什么操作,因此我无法判断移动对象是否需要用指针固定。通过指针保存它们的主要原因是多态性(此处不使用,因为您似乎没有创建子类对象),并允许它们的生存期独立于调用堆栈。听起来你也没有这个理由。那么,为什么不:
std::pair<Move, Piece*> pr(Move(x1,y1,x2,y2), aPiece);
std::对pr(移动(x1、y1、x2、y2),每个);
我假设在递归调用返回后,您有一些不需要保留的临时变量。如果是这种情况,您可以在函数中自己的范围内声明它们。一旦离开该范围,其中声明的自动变量将不再占用堆栈中的空间
int recursive_function(int a, int b){
int total;
{ //new scope
int temp[20];
//do stuff using temp and total
} //temp goes out of scope, not taking up space on stack anymore
total += recursive_function(a+total,b);
{
int temp[25];
//do stuff with this other temp
}
total += recursive_function(a,b+total);
return total;
}
编辑:
作为对更新的响应,如果您使用new
分配内存,则需要在完成后使用delete
释放内存。在这种情况下,行将是delete M代码>
void recursive_function(pair <Move *, Piece *> last_move){
Move * M = new Move(x1,y1,x2,y2);
pair <Move *, Piece *> pr (M,aPiece);
recursive_function(pr);
delete M;
}
void递归函数(配对最后移动){
移动*M=新移动(x1,y1,x2,y2);
成对pr(M,每个);
递归函数(pr);
删除M;
}
我认为,更有可能的情况是,您的“堆栈”分配对象与此无关,事实上,您忘记了删除以前新创建的内容。可能是移动
对象?关于更新:为什么移动*
和新移动
<代码>移动
听起来像是一个可以复制的值对象。同上件
(但这不太确定——您可以为
每个片段)。您的递归方法是否使用尾部调用@DKACKMAN在一个国际象棋程序中是不太可能的,如果它是现代C++编译器将优化它。哈哈,我几乎使用了NexSaCUP算法:YEA我发现这个新的语句可能是问题……(检查上面更新的描述)我认为标准允许编译器优化POD变量的生存期。任何析构函数的调用时间都是显式的,因此使用类变量可能更好地服务于该示例。