gpt4 book ai didi

c - 释放内存时出现奇怪的 C 错误?

转载 作者:行者123 更新时间:2023-11-30 15:51:23 27 4
gpt4 key购买 nike

我仍在尝试让我的遗传算法发挥作用(昨天我遇到了内存分配问题,因此在尝试释放它时出现了可怕的错误),但今天我有了这段代码

while (iCurrentGen <= data->m_iMaxGenerations)
{
arrfSelectedChromosomes = selection(&data[0], szChromosomes);
iSelectedLen = order_descending_grid(arrfSelectedChromosomes);
szAuxGen = crossover(&data[0], arrfSelectedChromosomes, szChromosomes, iSelectedLen);
//szChromosomes is what I need to free after that call returns
free_generation(&data[0], szChromosomes);//Code Explotion
szChromosomes = szAuxGen;
szAuxGen = NULL;
++iCurrentGen;
}

我在 free_ Generation() 函数调用之前检查了它的内容,如下图所示:

(变量前四个值)

Variable first four values

但是在 free_ Generation() 函数内部,同一个变量会丢失一些值(特别是当 i 取值为 2 时,i 为for循环索引),如下所示:

(函数内的变量值)

Variable values inside the function

我在下面发布了 free_ Generation 代码:

void free_generation(struct INPUT_DATA* d, char** szChromosomes)
{
int i;

for (i = 0; i < d->m_iPopulationSize; ++i)
{
free(szChromosomes[i]);
}

free(szChromosomes);
szChromosomes = NULL;
}

szChromosomes的定义如下:

char** szChromosomes = (char**)malloc(d->m_iPopulationSize * sizeof(char*));

srand(time(NULL));
for (i = 0; i < d->m_iPopulationSize; ++i)
{
szChromosomes[i] = (char*)malloc((d->m_iBitsPChromosome + 1) * sizeof(char));
for (j = 0; j < d->m_iBitsPChromosome; ++j)
{
szChromosomes[i][j] = rand_1_0(0.0, 1.0) == 1? '1' : '0';
}
szChromosomes[i][j] = '\0';
}

我需要澄清的是,该值的损失仅在顶部发布的 while 循环的第二次迭代之后发生。我的意思是,第一次运行时一切正常,但在这次迭代之后,第二次运行的行为如上所述。

编辑:

我忘记包含循环控制变量的增量(感谢您指出这一点!不,它不是全局的 xD)。我包括部分交叉代码:

    char** crossover(struct INPUT_DATA* d, float** arrfSelectedChromosomes, char** arrszChromosomes, int iChromosomesInGrid)
{
int i;
int iTIndex = 0, iRPos = 0;
char* szFirstChromosome = NULL;
char* szSecondChromosome = NULL;
char* szFirstNewChrom = (char*)malloc((d->m_iBitsPChromosome + 1) * sizeof(char));
char* szSecondNewChrom = (char*)malloc((d->m_iBitsPChromosome + 1) * sizeof(char));

char** arrszNewPop = (char**)malloc(d->m_iPopulationSize * sizeof(char*));

int iSplitPoint = (int)(d->m_iBitsPChromosome / 4);

float fCrossOverProb = CROSSOVER_PROBABILITY;

srand(time(NULL));
for (i = 0; i < d->m_iPopulationSize; i += 2)
{
iRPos = rand() % iChromosomesInGrid;
iTIndex = (int)arrfSelectedChromosomes[iRPos][0];
szFirstChromosome = arrszChromosomes[iTIndex];
iRPos = rand() % iChromosomesInGrid;
iTIndex = (int)arrfSelectedChromosomes[iRPos][0];
szSecondChromosome = arrszChromosomes[iTIndex];

if (is_same_chromosome(szFirstChromosome, szSecondChromosome))
{
i -= 2;
continue;
}

if (fCrossOverProb < CROSSOVER_PROBABILITY)
{
//if probability is lower than the defined prob. we keep both chromosomes
strcpy(szFirstNewChrom, szFirstChromosome);
strcpy(szSecondNewChrom, szSecondChromosome);
}
else
{

strcpy(szFirstNewChrom, szFirstChromosome);
szFirstNewChrom[iSplitPoint] = '\0';
strcat(szFirstNewChrom, &szSecondChromosome[iSplitPoint]);

//Para crear el segundo hijo se realiza una operacion similar
strcpy(szSecondNewChrom, szSecondChromosome);
szSecondNewChrom[iSplitPoint] = '\0';
strcat(szSecondNewChrom, &szFirstChromosome[iSplitPoint]);
}

arrszNewPop[i] = szFirstNewChrom;
arrszNewPop[i + 1] = szSecondNewChrom;
}

return arrszNewPop;
}

最佳答案

自从功能请求 mark a comment as an answer仍被拒绝,我将上述解决方案复制到此处。

n.m 你就是那个男人!非常感谢..这是一个重复指针的问题,这是由于交叉函数中的内存分配错误造成的。我在函数开头为 szFirstNewChrom 和 szSecondNewChrom 分配内存,但该内存用于 30 个不同的字符串。由于这个可怕的错误, free_ Generation 函数一直失败,因为它试图释放之前释放的指针。谢谢你们! ——豪尔赫·塞斯佩德斯

关于c - 释放内存时出现奇怪的 C 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com