1

我工作的這個VST插件卷積(64位Windows 7,VS2010),我決定嘗試英特爾C++編譯器。我正在優化算法,所以我有一個備份項目,以防止出現任何故障,並且我正在做一個實驗。這兩個項目都可以編譯並運行,沒有問題。安裝英特爾編譯器後,雖然我嘗試的項目將導致堆損壞的錯誤,所以我開始調試追查這個問題,但我無法找到的代碼,導致它,因爲在不觸發堆損壞錯誤的行執行,但在DLL終止之後(調試器也沒有顯示訪問違規)。奇怪的英特爾C++編譯器錯誤

在這一點上,我開始切割出的部分代碼,看看我能找出問題,我發現(明顯),這是我eperimenting的類。現在,這裏是怪異的一部分:我可以更改代碼的方法裏面,但只要我添加一個變量來備份類(即正常工作的),甚至一個int,我得到的堆損壞錯誤,只是一個decleared和從未引用的變量就足夠了。

這是類CRTConvolver:

class CRTConvolver 
{ 
public: 

    CRTConvolver(); 
    ~CRTConvolver(); 

    bool Init(float* Imp, unsigned ImpLen, unsigned DataLen); 
    void doConv(float* input); 

    Buff Output; 

    int debug_test; 

private: 

    void ZeroVars(); 
    int Order(int sampleFrames); 
    template <class T> void swap (T& a, T& b); 

    Buff *Ir_FFT,*Input_FFT,Output2,Tmp,Prev,Last; 
    float *Tail; 

    unsigned nBlocks,BlockLen,Bl_Indx; 

    IppsFFTSpec_R_32f* spec; 

}; 

即 「INT debug_test;」使得完美工作的VST模塊與Cubase初始化時崩潰的程序之間存在差異。

總是用於調試這裏有destr和構造:

CRTConvolver::CRTConvolver() 
{ 
     //IppStatus status=ippInit(); 
     //ZeroVars(); 
} 

CRTConvolver::~CRTConvolver() 
{ 
    //Init(NULL,NULL,NULL); 
} 

這裏是淺黃色的外觀類,如:

class Buff { 
public: 
     Buff(); 
     Buff(unsigned len); 
     ~Buff(); 

     float* buff; 
     unsigned long length; 

private: 

     void Init(unsigned long len); 
     void flush(); 

     friend class CRTConvolver; 
} 



Buff::Buff() 
{ 
     length=NULL; 
     buff=NULL; 
} 

Buff::~Buff() 
{ 
    // flush(); 
} 

基本上如果創建和銷燬該類絕對沒有,它只是包含長度和buff變量。如果我也繞過這兩個變量初始化,堆錯誤消失。

的結構簡單,即使它是所有無類CRTConvolver隨後銷燬軟件崩潰,這是真的沒有意義,我的部分...

作爲一個側面說明,創建我CRTConvolver類是這樣的:

ConvEng = new CRTConvolver[NCHANNELS]; 

我若這樣來代替:

CRTConvolver ConvEng[NCHANNELS]; 

我避開堆棧損壞錯誤變量ConvEng。 如果我切換回微軟編譯器,即使在編譯和運行完全相同的版本以前可以無誤地運行時,情況也會保持不變....

我無法強調在安裝英特爾編譯器之前一切都運行得很好,是否有可能出現問題或者某處存在不兼容問題?

我真的運行的想法在這裏,我希望有人能夠幫助。

感謝

+0

您是否在「Buff」類中添加了新變量?在這種情況下,你應該重建一次。 – Naveen 2012-07-16 12:16:04

+1

與您的問題無關,但不應將值(例如緩衝區長度)設置爲NULL,因爲它只能用於指針。技術上它將在長度字段中設置爲零,而使用逐字'0'代替更具可讀性。 – 2012-07-16 12:17:34

+0

請發佈完整但重現問題的最小代碼。 – 2012-07-16 12:22:48

回答

0

去猜測,因爲這個問題是最有可能的不確定的行爲,但在你的代碼的其他一些地方:

遵守三個原則。你應該有一個拷貝構造函數和賦值操作符。如果你使用的是std容器,或者進行復制或分配,沒有這些容器,如果你在析構函數中刪除了內存,你會遇到麻煩。

0

它看起來對我說,CRTConvolver默認的構造函數(創建陣列中使用)被寫入內存不屬於它。如果英特爾編譯器具有不同的類佈局規則(或數據對齊規則),則它可能會暴露微軟編譯器規則下的良性bug。

CRTConvolver類是否包含Buff類的任何實例?

更新對代碼更新迴應:

CRTConvolver類包含的Buff四個實例,讓我懷疑這是問題所在。它可能是一個版本不匹配 - CRTConvolver類認爲Buff比它實際上更小。我建議你重新編譯一切並回到我們。

+0

我剛貼了代碼,看看你是否介意。 – user1528667 2012-07-16 13:28:24

+0

我重建瞭解決方案,但也沒什麼改變... – user1528667 2012-07-16 14:13:00

+0

如果部分代碼被編譯由英特爾和部分由微軟,那麼他們可能不同意在'Buff'類的佈局。這是可能的,你認爲?您提到'解決方案' - 這是英特爾也使用的術語嗎? – TonyK 2012-07-16 18:11:08