清除c+中堆栈中分配的内存+; 我用递归算法在C++中实现了一个国际象棋机器人,程序对每个移动节点进行了一百万个节点的评估。

清除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,每个); 它在执行移动函数中,在递归中被调用了一百万次 我的问题是,一旦所有

随着时间的推移,它占用的内存将超过1G

但我并不需要在我完成移动后声明的变量

那么,如何像java的垃圾收集器一样,手动刷新堆栈内存以清除堆栈上先前声明的变量呢

更新 我发现我的资料中有这样一行:

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变量的生存期。任何析构函数的调用时间都是显式的,因此使用类变量可能更好地服务于该示例。