free()检测堆损坏

时间:2015-02-01 00:55:39

标签: c++ free memory-corruption

使用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超过其分配的限制。

1 个答案:

答案 0 :(得分:0)

您对realloc的最后一次调用导致*parrayFarticle指向具有奇数(在数学意义上)大小的块,并且(很可能)太小。