繁体   English   中英

Linux :: glibc中的C ++运行时错误检测到free():下一个大小无效(快速):带有无效ptr元素的堆栈

[英]C++ runtime error in Linux ::glibc detected free(): invalid next size (fast): Stack with void ptr element

这是我的第一个问题,因此如果这太愚蠢,我将深表歉意。 我尝试搜索,但仍然找不到代码问题。 我正在调试别人的代码,这在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的运行时内存调试器,它会告诉您何时已写完分配的内存末尾以及哪一行代码存在该问题。 这是解决此类问题的第一件事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM