При использовании Visual Studio 2013 повреждение кучи обнаруживается при вызове free()
.
Он не обнаружен в Linux.
Мой код, кажется, работает нормально, пока он не попадет в свободную функцию. Я звоню бесплатно много раз, но в одном конкретном случае он вызывает всплывающее окно с сообщением HEAP CORRUPTION DETECTED.
Я выделил память для хранения указателей на строки (слова) для двух наборов слов. Для первого набора слов при их освобождении не сообщается об ошибке.
Для второго набора слов при их освобождении появляется сообщение об ошибке.
Вот код для первого набора слов, я создал массив слов, называемый arrayFictionary. Функция принимает указатель на массив указателей и добавляет новые слова. Сообщение об ошибке не предоставляется при освобождении (arrayFictionary).
void ConvertFictionary(char*** parrayFictionary, char* fictionary) {
char * pTemp = 0;
int32_t count = 1;
// put first fictionary word into an array
if(!(pTemp=strtok(fictionary, "\n"))) {//if the dictionary end is reached,
(*parrayFictionary)[count-1] = pTemp; // exit while loop
goto skipD;
}
*parrayFictionary = (char**) realloc(*parrayFictionary, (count + 1)*sizeof(char*));
(*parrayFictionary)[count-1] = pTemp;
count++;
while(1) {// put fictionary words into an array, exit when done
if(!(pTemp=strtok(NULL, "\n"))) {//if the dictionary end is reached,
(*parrayFictionary)[count-1] = pTemp; // exit while loop
break;
}
*parrayFictionary = (char**) realloc(*parrayFictionary, (count + 1)*sizeof(char*));
(*parrayFictionary)[count-1] = pTemp;
count++;
}
skipD:
return;
}
Вот код для выделения массива для моего второго набора слов, называемого arrayFarticle. Тот же метод используется с небольшими различиями. Сообщение об ошибке появляется после вызова free (arrayFarticle).
void ConvertFarticle(char*** parrayFarticle, char* farticle)
{
char * pTemp = 0;
int32_t count = 1;
// put first farticle word into an array
if(!(pTemp=strtok(farticle, "0123456789.,;: '\"\n!@#$%%^&*()_-+=|\\[]{} <>?/~'"))) //if the farticle end is reached, exit while loop
{
(*parrayFarticle)[count-1] = pTemp;
goto skipA;
}
if(strlen(pTemp)>=2)
{
*parrayFarticle = (char**) realloc(*parrayFarticle, sizeof(char*)*count + sizeof(char*)*2);
(*parrayFarticle)[count-1] = pTemp;
count++;
}
while(1) // put farticle words into an array, exit when done
{
if(!(pTemp=strtok(NULL, "0123456789.,;: '\"\n!@#$%%^&*()_-+=|\\[]{}<>?/~'"))) //if the farticle end is reached, exit while loop
{
(*parrayFarticle)[count-1] = pTemp;
break;
}
if(strlen(pTemp)>=2)
{
*parrayFarticle = (char**) realloc(*parrayFarticle, sizeof(char*)*count + 1);
(*parrayFarticle)[count-1] = pTemp;
count++;
}
}
skipA:
return;
}
Я честно не знаю, что происходит. Я убедился, что arrayFarticle не записывается за пределы выделенного предела.
Последний вызов realloc
приводит к тому, что *parrayFarticle
указывает на блок с нечетным (в математическом смысле) размером и (весьма вероятно) слишком мал.
free
не приведет к повреждению, но повреждение не может быть обнаружено, пока не выполнитсяfree
.