Я пишу код для генетического алгоритма, и я застреваю в точке, где я не могу освободить неиспользуемую память. Это мой основной (код):Ошибка при освобождении двойной указатель в C
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 (& данные [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;
Wh первый вызов бесплатно (szCromosomes [i]); происходит, я получаю следующую ошибку:
ОПРЕДЕЛЕННАЯ КОРРУПЦИЯ HEAP: после нормального блока (# 99). CRT обнаружил, что приложение записано в память после завершения буфера кучи.
Попробуйте '(char *) malloc (d-> m_iBitsPChromosome + 1);'. В конце вам нужен дополнительный символ для '' \ 0''. Умножение на 'sizeof (char)' избыточно, поскольку «char», определяемый стандартом, имеет размер 1 байт. –