我正在调试一个程序,在那里我发现一些数据在他们不应该的地方被改变。我使用gdb跟踪程序,发现目标数据在其他一些数据的delete
函数中发生了变化!
起初我认为两个区域之间存在一些内存重叠,但后来检查了两个区域的起始和结束地址,它们没有重叠!只离开delete
行!
这是发生这种情况的函数,不应该更改的数据是freemap
,而被释放的数据是synthops
:
void BasicBlock::free() {
cout << "freemap 2 : " << this->mfnlo_loc.chunk->freemap[2] << "\n";
cout << "freemap 59 : " << this->mfnlo_loc.chunk->freemap[59] << "\n";
cout << "freemap : " << &(this->mfnlo_loc.chunk->freemap) << "\t" << sizeof(this->mfnlo_loc.chunk->freemap)+&(this->mfnlo_loc.chunk->freemap) << "\n";
cout << "synthops : " << synthops << "\t" << synthops+sizeof(uopimpl_func_t)*count << "\n";
if (synthops)
{
delete[] synthops;
}
cout << "freemap 2 : " << (this->mfnlo_loc.chunk->freemap[2]) << "\n";
cout << "freemap 59 : " << this->mfnlo_loc.chunk->freemap[59] << "\n";
synthops = NULL;
::free(this);
}
输出如下:
freemap 2 : 1
freemap 59 : 1
freemap : 0x3319a50 0x3319a90
synthops : 0x3319d50 0x331acd0
freemap 2 : 0
freemap 59 : 0
freemap
行后显示delete
更改,也表明它们在内存中都不重叠。
synthops
分配在另一个函数中:
bb.synthops = new uopimpl_func_t[bb.count];
为什么会这样?代码是C和C ++的混合,这意味着混合了new
和malloc
(但一致使用,例如delete
没有malloc
)。是这个原因?或者是别的什么?
答案 0 :(得分:0)
我的通灵调试技巧告诉我你没有遵循BasicBlock
的三条规则,特别是你省略了复制构造函数。然后你(浅)复制了那个对象(特别是synthops
成员),然后导致双重删除,此时所有的赌注都被关闭。