gpt4 book ai didi

c++ - Linux::glibc detected free(): invalid next size (fast): Stack with void ptr element中的C++运行时错误

转载 作者:行者123 更新时间:2023-12-03 08:58:36 25 4
gpt4 key购买 nike

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

关于c++ - Linux::glibc detected free(): invalid next size (fast): Stack with void ptr element中的C++运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15348498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com