【发布时间】:2015-06-05 12:35:22
【问题描述】:
我正在调试一个程序,在该程序中发现一些不应该更改的数据。我使用 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)。这就是原因吗?或者是别的什么?
【问题讨论】:
-
合成器有析构函数吗?
-
您向我们展示的只是您的程序最终崩溃的地方。很可能,问题在您发布的代码执行之前就开始了。此外,如果
BasicBlock是非 POD,那么如果您以任何方式(placement-new除外)使用malloc来创建它的实例,则它的行为未定义 -
@PaulMcKenzie 这可能是问题所在!实际上 BasicBlock 是使用 malloc 分配的。我会改变它,看看它是否能解决问题。
-
@NeilKirk 不,没有析构函数。
-
@PaulMcKenzie 问题仍然存在。
标签: c++ c malloc dynamic-memory-allocation