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