释放对象的校验和不正确 - 分配问题
Incorrect checksum for freed object - problem with allocation
我正在尝试用 C++ 编写一个 class 来创建一个动态数组,但我遇到了这个问题
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;
}
问题是您在bSetNewSize()
中删除了c_table
并且没有为其设置新值,而是在以后的调用中使用了它。我想你是想把 c_table = cTable;
放在 bSetNewSize()
函数的末尾,正如 500 - Internal Server Erro 评论的那样。
此外,如果将 string
参数作为 const string&
传递给构造函数,速度会更快。
编辑:你确定
if(iTableLen >= 0)
return false;
这意味着您实际上仅在 iTableLen
为负数时才调整大小。
你不是说
if(iTableLen < 0)
return false;
我正在尝试用 C++ 编写一个 class 来创建一个动态数组,但我遇到了这个问题
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;
}
问题是您在bSetNewSize()
中删除了c_table
并且没有为其设置新值,而是在以后的调用中使用了它。我想你是想把 c_table = cTable;
放在 bSetNewSize()
函数的末尾,正如 500 - Internal Server Erro 评论的那样。
此外,如果将 string
参数作为 const string&
传递给构造函数,速度会更快。
编辑:你确定
if(iTableLen >= 0)
return false;
这意味着您实际上仅在 iTableLen
为负数时才调整大小。
你不是说
if(iTableLen < 0)
return false;