0

这是我的第一个问题,所以如果这太愚蠢了,我会道歉。我试图搜索,但仍然无法找到代码的问题。我正在调试别人的代码,它在 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)
 …

如果这很明显,我想再次道歉..

我确信这是由于内存分配给结构的方式。

谢谢!

4

1 回答 1

0

您可能在某处出现缓冲区溢出。您从 glibc 获得的错误消息表明堆已损坏,通常是通过覆盖跟踪已使用和空闲块的内部记录。glibc 比其他平台更积极地尝试检测这些类型的错误;您可能在其他地方也有相同的错误,但 libc 没有检测到它。

至于错误的确切位置,我没有直接在您的代码中看到它,但是该代码做了很多假设(例如预先分配数据结构中记录的大小的缓冲区)和程序的其余部分可能不遵循这些假设。

简短版:我会安装 valgrind 并在其下运行您的程序。这是一个适用于 UNIX 的运行时内存调试器,它会告诉您何时写入超过分配内存的末尾以及哪一行代码存在该问题。这是解决这类问题的第一件事。

于 2013-03-17T19:49:07.923 回答