【发布时间】:2013-02-27 16:13:04
【问题描述】:
我正在为遗传算法编写代码,但我被困在无法释放未使用内存的地步。这是我的 main() 代码:
szChromosomes = initial_population(&data[0]);
while (iCurrentGen <= data->m_iMaxGenerations)
{
arrfSelectedChromosomes = selection(&data[0], szChromosomes);
iSelectedLen = order_descending_grid(arrfSelectedChromosomes);
szAuxGen = crossover(&data[0], arrfSelectedChromosomes, szChromosomes);
free_generation(&data[0], szChromosomes);//Error line
szChromosomes = szAuxGen;
szAuxGen = NULL;
}
initial_population(&data[0]) 像这样创建 szChromosomes 数组(我稍后会尝试释放它):
char** initial_population(struct INPUT_DATA* d)
{
int i, j = 0;
float fMember = 0.0;
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 * 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';
}
return szChromosomes;
}
当我调用 free_generation 函数时,下面的 For 循环被执行:
int i;
for (i = 0; i < d->m_iPopulationSize; ++i)
{
free(szChromosomes[i]);
}
free(szChromosomes);
szChromosomes = NULL;
当第一次调用free(szChromosomes[i]);发生,我收到以下错误:
检测到堆损坏:在正常块 (#99) 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存。
【问题讨论】:
-
试试
(char*)malloc(d->m_iBitsPChromosome + 1);。最后,您需要为'\0'添加一个额外的字符。乘以sizeof(char)是多余的,因为标准定义的char大小为 1 个字节。
标签: c memory free genetic-algorithm