我正在为遗传算法编写代码,而我却陷入了无法释放未使用内存的地步。这是我的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(&amp; 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;
第一次免费打电话时(szChromosomes [i]);发生了,我得到以下错误:
HEAP CORRUPTION DETECTED:正常阻止后(#99)。 CRT检测到应用程序在堆缓冲区结束后写入内存。
答案 0 :(得分:2)
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;
您插入了&#39; \ 0&#39;在每个字符串末尾szChromosomes [i]但只使用长度为d-> m_iBitsPChromosome的malloc
所以你试着在内存中写得太远了。要改变它,只需将第二个malloc更改为:
szChromosomes[i] = (char*)malloc((d->m_iBitsPChromosome + 1) * sizeof(char));
答案 1 :(得分:1)
szChromosomes[i][j] = '\0';
此行写入您不拥有的内存。
例如。举个例子
char * p;
p = malloc(2);
p[0] = 'a';
p[1] = 'b';
你不应该这样做
p[2] = '\0'
之后,因为你只分配了2个字节,但你写的是3个字节。
你可以解决这两种方式
您需要'\ 0'吗?除非你打算使用<string.h>
中的一个函数,它希望'\ 0'检查结束,你需要通过'\ 0'来终止它。在您自己的遍历数组的代码中,您可以使用以ctr < d->m_iBitsPChromosome
结尾的for循环遍历。
或者您可以分配malloc(d->m_iBitsPChromosome + 1)