释放对象的校验和不正确 - 分配问题

Posted

技术标签:

【中文标题】释放对象的校验和不正确 - 分配问题【英文标题】:Incorrect checksum for freed object - problem with allocation 【发布时间】:2021-12-08 15:34:19 【问题描述】:

我正在尝试用 c++ 编写一个创建动态数组的类,但遇到了这个问题

malloc: Incorrect checksum for freed object 0x7f9ff3c05aa8: probably modified after being freed.
Corrupt value: 0x2000000000000

我实现了三个构造函数(默认、参数化和复制),我认为这是导致问题的原因,因为代码在这里中断

CTable::CTable(string sName, int iTableLen)

    s_name = sName;
    cout<<"parametr: "<<s_name<<endl;
    c_table = new int[iTableLen];
    i_table_lenghth=iTableLen;

我还必须编写一个方法来更改数组的大小,并在成功的情况下返回 true,在失败的情况下返回 false。可能是这个方法导致了问题,所以我就是这样实现的。

bool CTable :: bSetNewSize(int iTableLen)

   int size;
   if(iTableLen < 0)
       return false;
   else if(iTableLen>=i_table_length)
       size = i_table_length;
   if(iTableLen < i_table_length)
       size = iTableLen;
   int *cTable;
   cTable = new int[iTableLen];
   for (int ii = 0; ii < size; ii++)
   
       cTable[ii] = c_table[ii];
   
   delete [] c_table;
   c_table = cTable;
   return true;

编辑:问题不在于代码的任何这些部分。应该克隆对象的方法导致错误。发生这种情况是因为我静态分配了对象而不是动态分配。下面是固定方法:

CTable* CTable::pcClone()

    CTable *obj_clone;
    obj_clone = new CTable(*this);
    return obj_clone;

【问题讨论】:

您的意思是写delete []cTable?您的变量名称相似,因此感觉像是一个错字。如果代码正确,请在打开地址清理程序的情况下构建或通过 valgrind 运行代码。 您的bSetNewSize 函数泄漏内存并将c_table 作为悬空指针 为什么不直接使用std::vector 来解决所有问题? 不要错过bSetNewSize()末尾的c_table = cTable;吗? std::vector 有什么错误吗? 【参考方案1】:

问题是您删除了bSetNewSize() 中的c_table 并且没有为其设置新值,而是在以后的调用中使用了它。正如500 - Internal Server Erro 所评论的那样,我认为您的意思是将c_table = cTable; 放在bSetNewSize() 函数的末尾。

如果将string 参数作为const string&amp; 传递给构造函数,也会更快。

编辑:你确定要放弃

if(iTableLen >= 0)
   return false;

这意味着只有当iTableLen 为负时,您才会真正调整大小。 你不是说

if(iTableLen < 0)
   return false;

【讨论】:

以上是关于释放对象的校验和不正确 - 分配问题的主要内容,如果未能解决你的问题,请参考以下文章

realloc 错误:释放对象的校验和不正确

已释放对象的校验和不正确 - 对象在被释放后可能已被修改。我该如何解决?

CGContextDrawImage(Swift)上的间歇性“释放对象的校验和不正确”错误

Java 套接字:TCP 校验和不正确

在objective-c中释放数组的内存问题

TCP 校验和与wireshark 校验和不匹配(正好相差1)