删除函数的奇怪行为(混合C和C ++)

时间:2015-04-01 00:47:21

标签: c++ c malloc dynamic-memory-allocation

我正在调试一个程序,在那里我发现一些数据在他们不应该的地方被改变。我使用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 ++的混合,这意味着混合了newmalloc(但一致使用,例如delete没有malloc)。是这个原因?或者是别的什么?

1 个答案:

答案 0 :(得分:0)

我的通灵调试技巧告诉我你没有遵循BasicBlock的三条规则,特别是你省略了复制构造函数。然后你(浅)复制了那个对象(特别是synthops成员),然后导致双重删除,此时所有的赌注都被关闭。