1
我正在调试一个程序,我发现一些数据被改变的地方,他们不应该。我使用gdb跟踪了程序,发现目标数据在其他一些数据的delete
函数中发生了变化!通过删除功能的奇怪行为(混合C和C++)
起初我认为两个区域之间存在一些内存重叠,但后来我检查了两个区域的开始和结束地址,它们不重叠!只留下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
行之后发生了变化,这也表明它们在内存中不重叠。
bb.synthops = new uopimpl_func_t[bb.count];
为什么会发生这种情况:
synthops
在这样的另一个功能分配?该代码是C和C++的混合,这意味着混合了new
和malloc
(但始终如此,例如delete
和malloc
)。这是为什么?或者是别的什么?
合成器是否有析构函数? – 2015-04-01 00:49:35
您向我们展示的是您的程序最终崩溃的地方。很可能,问题在您发布的代码执行之前就已经开始。此外,如果'BasicBlock'是非POD,那么使用'malloc'来创建它的一个实例是不确定的行为,如果你以任何方式使用它(除了'placement-new') – PaulMcKenzie 2015-04-01 00:52:34
@PaulMcKenzie可能是问题!实际上BasicBlock是使用malloc分配的。我会改变它,看看它是否能解决问题。 – ProWi 2015-04-01 01:15:03