C min-max算法中的内存泄漏

C min-max算法中的内存泄漏,c,memory-leaks,minimax,C,Memory Leaks,Minimax,我对编程完全陌生,一个月前,我在编写自己的国际象棋引擎的完全随机尝试中,刚刚学会了C(我的目标是创造出最适合自己的东西。很吸引人)。因此,请尽可能清楚地回答你的问题,当我缺乏解释时,请要求澄清 目前,我的引擎在我的1.8Ghz处理器上每秒可以分析大约0.5到0.8百万个位置,任何关于这方面的想法都是受欢迎的,但无论如何,对我来说,让我的引擎更快的唯一方法是按固定顺序尝试移动,这样坏的移动就会被排除在搜索之外。 为此,我将代码从传递int变量更改为传递int指针。我的想法是坚持得分——这一动作产生

我对编程完全陌生,一个月前,我在编写自己的国际象棋引擎的完全随机尝试中,刚刚学会了C(我的目标是创造出最适合自己的东西。很吸引人)。因此,请尽可能清楚地回答你的问题,当我缺乏解释时,请要求澄清

目前,我的引擎在我的1.8Ghz处理器上每秒可以分析大约0.5到0.8百万个位置,任何关于这方面的想法都是受欢迎的,但无论如何,对我来说,让我的引擎更快的唯一方法是按固定顺序尝试移动,这样坏的移动就会被排除在搜索之外。 为此,我将代码从传递
int
变量更改为传递
int
指针。我的想法是坚持得分——这一动作产生了得分。代码仍然可以工作,但大小会增加。我在谷歌上搜索并尝试了一些内存泄漏工具,但它们只告诉我泄漏的内存分配到了哪里,我已经知道了,但没有告诉我它的地址是什么时候丢失的

我想,如果我只是发布我的代码,一些有经验的人就可以马上发现漏洞。 现在我上网寻求帮助,我发现我的代码在逻辑上等同于一个名为minimax和alpha-beta修剪的算法,这个算法已经存在了几十年。酷

int evaluate(int *board, int capture) { ... return board evaluation; }

int *Black(int *board, int depth, int *max, int *min) {
    if (depth == 0) {
        temp = malloc(20 * sizeof(int)); //eventually i will store
    }                 
    minlocal = malloc(20 * sizeof(int)); //moves next to the score
    *minlocal = *min;  //this is what i came up with so that min/max        
                       //of a higher function call doesn't get changed
    for (all moves) {
        if (depth > 0) {
            temp = whitemove(board, depth - 1, max, minlocal);
        } else {
            *temp = evaluate(board, capture);
        }
        if (*temp <= *max) {
            ;free(minlocal);
            return temp;
        }
        if (*temp < *minlocal) {
            *minlocal = *temp;
        }
        if (depth > 0) {
            free(temp);
        }
    }
    if (depth = 0) {    //<====== silly bug!
        free(temp);
    }
    return minlocal;
}

int *whitemove(int *board, int depth, int *max, int *min) {
    temp = malloc(20 * sizeof(int));
    maxlocal = malloc(20 * sizeof(int));
    *temp = -30000;
    *maxlocal = *max;
    for (all moves) {
        v = blackmove(board, depth - 1, maxlocal, min);
        if (*v > *temp) {
            free(temp);
            temp = v;
        } else {
            free(v);
        }
        if (*temp > *maxlocal) {
            *maxlocal = *temp;
        }
        if (*temp >= *min) {
            free(maxlocal);
            return temp;
        }
    }
    free(maxlocal);
    return temp;
}
int求值(int*board,int捕获){…返回board求值;}
整数*黑色(整数*板、整数深度、整数*最大值、整数*最小值){
如果(深度==0){
temp=malloc(20*sizeof(int));//最终我将存储
}                 
minlocal=malloc(20*sizeof(int));//移动到分数旁边
*minlocal=*min;//这是我提出的,因此min/max
//一个更高的函数调用不会被改变
(所有动作){
如果(深度>0){
温度=白板移动(白板,深度-1,最大,最小本地);
}否则{
*temp=评估(板、捕获);
}
如果(*0){
免费(临时);
}
}
如果(深度=0){/*温度){
免费(临时);
温度=v;
}否则{
免费(五);
}
如果(*temp>*maxlocal){
*maxlocal=*温度;
}
如果(*温度>=*分钟){
免费(本地);
返回温度;
}
}
免费(本地);
返回温度;
}
阅读代码时,你可能会注意到我的东西只能播放白色,深度只能是偶数,这对我现在来说并不重要


据我所知,我采取的这种方法可能是绝对愚蠢的,但它似乎并没有比以前慢,它应该能够存储游戏的台词,而不是简单的第一步。您似乎在很短的时间内就掌握了C语言的良好编程技能

然而,您仍然需要改进您的风格:演示非常重要,因为它有助于避免许多愚蠢的错误,并使您的代码对其他程序员和您自己都更具可读性

还可以使用编译器可以产生的所有警告以及适当的标志,例如
gcc-Wall-Wextra

Black
函数末尾有一个愚蠢的错误:

if (depth = 0)
显然应该读

 if (depth == 0)
这是你永远无法释放记忆的地方


您可能会在其他地方丢失已分配块的跟踪信息,或者在不需要分配的地方,如果不需要将本地数组返回给调用者,则使用本地数组会快得多。将指向本地数组的指针作为目标数组传递也可以减少内存分配量。

您似乎在很短的时间内学会了C语言的良好编程技能

然而,您仍然需要改进您的风格:演示非常重要,因为它有助于避免许多愚蠢的错误,并使您的代码对其他程序员和您自己都更具可读性

还可以使用编译器可以产生的所有警告以及适当的标志,例如
gcc-Wall-Wextra

Black
函数末尾有一个愚蠢的错误:

if (depth = 0)
显然应该读

 if (depth == 0)
这是你永远无法释放记忆的地方


您可能会在其他地方丢失已分配块的跟踪信息,或者在不需要分配的地方,如果不需要将本地数组返回给调用者,则使用本地数组会快得多。将指向本地数组的指针作为目标数组传递也可以减少内存分配量。

通常,在用C编写代码时,无论何时分配内存,都需要记住,需要正确地分配内存,在比较中使用双等于运算符。在我们的例子中,您有一个名为
temp
的变量,它将使用分配的内存,并且在每次初始化
whitemove
Black
时,您将为其分配新内存,而不
free
占用先前分配的内存,该内存保持分配状态,但您不再有它的引用

答案在上面,下面我会给你一些建议:

很高兴你没有学习就发明了alpha-beta修剪,但是你需要优雅地实现它。例如,您有一个
whitemove
和一个
Black
函数。为什么你把
Black
命名为“Black”,而不是一致地将其命名为“blackmove”?此外,在编写函数时,需要尽可能全面地解决问题。白棋和黑棋有何不同

  • 他们试图朝着不同的方向最大化评估
  • 它们可以用不同的部件移动
现在,如果考虑到这一点,可以将这两个函数作为一个函数编写。您不需要返回大内存块,因为这不是我们打算从