【问题标题】:strange behavior by delete function (mixed C and C++)删除函数的奇怪行为(混合 C 和 C++)
【发布时间】: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

说明freemapdelete行之后发生了变化,也说明它们在内存中没有重叠。

synthops 分配在另一个函数中,如下所示:

bb.synthops = new uopimpl_func_t[bb.count];

为什么会这样?该代码混合了 C 和 C++,这意味着混合了 newmalloc(但始终如一地使用,例如,没有 deletemalloc)。这就是原因吗?或者是别的什么?

【问题讨论】:

  • 合成器有析构函数吗?
  • 您向我们展示的只是您的程序最终崩溃的地方。很可能,问题在您发布的代码执行之前就开始了。此外,如果BasicBlock 是非 POD,那么如果您以任何方式(placement-new 除外)使用malloc 来创建它的实例,则它的行为未定义
  • @PaulMcKenzie 这可能是问题所在!实际上 BasicBlock 是使用 malloc 分配的。我会改变它,看看它是否能解决问题。
  • @NeilKirk 不,没有析构函数。
  • @PaulMcKenzie 问题仍然存在。

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


【解决方案1】:

我的心理调试技能告诉我,您没有遵循 BasicBlock 的三法则,特别是您省略了复制构造函数。然后你(浅)复制了那个对象(特别是synthops 成员),然后导致双重删除,此时所有的赌注都被取消了。

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多