C++ C++;Linux::glibc检测到free()中的运行时错误:下一个大小无效(fast):堆栈带有void ptr元素
这是我的第一个问题,如果这太愚蠢,我会道歉。我已尝试搜索,但仍然无法找到代码的问题。我正在调试其他人的代码,该代码在linux中出现此错误,并且在Solaris中运行良好C++ C++;Linux::glibc检测到free()中的运行时错误:下一个大小无效(fast):堆栈带有void ptr元素,c++,dynamic,error-handling,stack,glibc,C++,Dynamic,Error Handling,Stack,Glibc,这是我的第一个问题,如果这太愚蠢,我会道歉。我已尝试搜索,但仍然无法找到代码的问题。我正在调试其他人的代码,该代码在linux中出现此错误,并且在Solaris中运行良好 *** glibc detected *** free(): invalid next size (fast): 0x096c72b0 *** ======= Backtrace: ========= /lib/libc.so.6[0xa986c5] /lib/libc.so.6(cfree+0x59)[0xa98b09]
*** 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)
…
Typedef结构\u字段
{
整数大小;
Char-str[25];
无效*pData;
Void*pValue;
}场;
ABC班
{
字段*字段1;
字段*getFIeld(int);
…}
ABC::ABC()
{
field1=NULL;
}
ABC::~ABC()
{
对于(int I=0;I 对于(int i=0;i您可能在某处出现缓冲区溢出。您从glibc收到的错误消息表明堆已损坏,通常是通过覆盖跟踪已用和空闲块的内部记录。glibc在尝试检测此类错误时非常积极,比其他平台更积极;您可能其他地方也有同样的bug,但是libc没有检测到它
至于bug的确切位置,我没有在代码中直接看到它,但是代码正在做很多假设(例如预先分配数据结构中记录的大小的缓冲区),程序的其余部分可能没有遵循这些假设
简短版本:我将安装valgrind并在其下运行您的程序。这是一个UNIX运行时内存调试器,它将告诉您何时编写超过分配内存的末尾以及哪行代码有此问题。这是解决此类问题的第一件事。我已安装valgrind并在其下运行二进制文件它给了我一个无效的免费的()与我在gdb下运行二进制文件时收到的消息基本相同。当二进制文件损坏时,使用valgrind识别确切点的最佳方法是什么。只需以/./val/bin/valgrind--leak check=full--show reachable=yes或者有其他方法吗?谢谢!如果valgrind
报告一个无效的免费文件,它应该d已经为您提供了更多关于内存从何处分配以及从何处释放内存的信息。(当然,请确保您使用调试符号构建了二进制文件,但是如果您已经在使用gdb
,这应该不是问题。)看起来你在正确运行valgrind——在免费之前没有任何其他关于内存问题的输出?强制性的无用建议:停止使用太多原始指针。unique\u ptr
、shared\u ptr
、array
和vector
将让你的生活变得更加轻松。