2015-04-01 74 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成員),然後導致雙重刪除,此時所有投注都關閉。