这是我的第一个问题,所以如果这太愚蠢,我会道歉。我已经尝试搜索,仍然无法找到代码的问题。我正在调试别人的代码,在linux中给出这个错误,它在Solaris中运行得很好。
*** glibc detected *** free(): invalid next size (fast): 0x096c72b0 ***
======= Backtrace: =========
/lib/libc.so.6[0xa986c5]
/lib/libc.so.6(cfree+0x59)[0xa98b09]
...
代码是巨大的,有很多内部逻辑,但我试图创建一个问题可能在哪里的样本…
Typedef Struct _FIELD
{
Int size;
Char str[25];
Void *pData;
Void *pValue;
}FIELD;
Class ABC
{
FIELD * field1;
FIELD* getFIeld(int);
…}
ABC::ABC()
{
field1=NULL;
}
ABC::~ABC()
{
for (int I = 0; I < total_num; i++)
{
free (field1[i].pData);
free(field1[i],pValue);
}
free(field1);
}
FIELD* ABC::getField(int total_num)
{
FIELD *pFields = NULL;
pFields = GetValues( total_num);//just sets up pFields
field1 = malloc ( total_num * sizeof(FIELD));
for (int i =0 ; i<total_num; i++)
{
// earlier this code was memcpy, memcpy(&field1, &pFields, sizeof(FIELD)) I have changed this to explicit copy
Strcpy(field1[i].str, pFields[i].str);
field1[i].size = pFields[i].size;
field1[i].pData = malloc(fields[i].size);
field1[i].pValue = malloc(fields[i].size);
//I am not doing strdup for pData and PValue as I checked they are null at this point.
}
free(pFields);
return(field1);
}
…
//Main
FIELD* field1 = NULL;
……
field1 = getField(n);
…….
field1 =getField(n)
…
如果这是很明显的事情,我想再次道歉。
我确信这是由于内存分配给结构体的方式。
谢谢!
您可能在某个地方有缓冲区溢出。从glibc获得的错误消息表明堆已经损坏,通常是由于覆盖了跟踪已使用和空闲块的内部记录。与其他平台相比,Glibc在检测这类错误方面非常积极;您可能在其他地方有相同的错误,但libc没有检测到它。
至于错误的确切位置,我没有直接在你的代码中看到它,但该代码做出了相当多的假设(例如预分配数据结构中记录的大小的缓冲区),程序的其余部分可能不遵循这些假设。
简短的版本:我会安装valgrind并在它下面运行你的程序。这是一个用于UNIX的运行时内存调试器,它会告诉您何时编写的代码超过了分配的内存的末尾,以及哪一行代码出现了这个问题。这是解决这类问题的第一步