2015-04-01 56 views
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 

它显示freemapdelete行之后发生了变化,这也表明它们在内存中不重叠。

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

为什么会发生这种情况:

synthops在这样的另一个功能分配?该代码是C和C++的混合,这意味着混合了newmalloc(但始终如此,例如deletemalloc)。这是为什么?或者是别的什么?

+0

合成器是否有析构函数? – 2015-04-01 00:49:35

+3

您向我们展示的是您的程序最终崩溃的地方。很可能,问题在您发布的代码执行之前就已经开始。此外,如果'BasicBlock'是非POD,那么使用'malloc'来创建它的一个实例是不确定的行为,如果你以任何方式使用它(除了'placement-new') – PaulMcKenzie 2015-04-01 00:52:34

+0

@PaulMcKenzie可能是问题!实际上BasicBlock是使用malloc分配的。我会改变它,看看它是否能解决问题。 – ProWi 2015-04-01 01:15:03

回答

0

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