free () обнаружение повреждения кучи

0

При использовании 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 не записывается за пределы выделенного предела.

  • 0
    free не приведет к повреждению, но повреждение не может быть обнаружено, пока не выполнится free .
  • 0
    Предупреждение: обнаружен ThreeStarProgrammer .
Показать ещё 1 комментарий
Теги:
free
memory-corruption

1 ответ

0

Последний вызов realloc приводит к тому, что *parrayFarticle указывает на блок с нечетным (в математическом смысле) размером и (весьма вероятно) слишком мал.

  • 0
    Вау, я тупой. Спасибо. Я понял, что поместил sizeof (char *) * count +1 вместо sizeof (char *) * count + sizeof (char *) ....
  • 0
    Вопрос: я бы никогда не узнал об этой проблеме, если бы никогда не запускал ее на visual studio, как бы я узнал, если бы работал в Linux? Код никогда не падал.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню