使用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 :(得分:0)
您对realloc
的最后一次调用导致*parrayFarticle
指向具有奇数(在数学意义上)大小的块,并且(很可能)太小。