簡體   English   中英

奇怪的Intel C ++編譯器錯誤

[英]Weird Intel C++ compiler error

我正在研究此VST卷積插件(Windows 7 64位,VS2010),因此決定嘗試使用Intel c ++編譯器。 我當時正在優化算法,因此我有一個備份項目,以防萬一,並且我正在做一個實驗。 這兩個項目都可以編譯並沒有問題。 通過我正在嘗試的項目安裝英特爾編譯器后,將導致堆損壞錯誤,因此我開始調試以跟蹤問題,但由於在運行期間未觸發堆損壞錯誤,因此我找不到導致該問題的代碼行執行,但在DLL終止之后(調試器也沒有顯示訪問沖突)。

在這一點上,我開始刪除部分代碼,以查看是否可以隔離問題,並且(顯然)發現這是我正在嘗試的類。 現在出現了一個奇怪的部分:我可以更改方法中的代碼,但是一旦我向備份類中添加了一個變量(可以正常工作的變量),即使是int,我也會得到堆損壞錯誤,只是清除了永不引用變量就足夠了。

這是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和constr:

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

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

這是Buff類的外觀:

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();
}

基本上,如果創建和銷毀該類,則絕對不執行任何操作,它僅包含length和buff變量。 如果我也繞過了這兩個變量初始化,堆錯誤就會消失。

該軟件因簡單的構造而崩潰,並隨后銷毀了CRTConvolver類,盡管它所做的只是一無是處,這對我而言確實是毫無意義的部分。

附帶說明一下,我這樣創建CRTConvolver類:

ConvEng = new CRTConvolver[NCHANNELS];

如果我這樣聲明:

CRTConvolver ConvEng[NCHANNELS];

我在變量ConvEng周圍收到堆棧損壞錯誤。 如果我切換回Microsoft編譯器,即使編譯並運行的版本與以前完全沒有錯誤的完全相同,情況仍然一樣。

我不能在安裝Intel編譯器之前一切運行正常的情況下強調一下,這是否有可能出現問題或某處存在不兼容性?

我的想法真的用完了,希望有人能夠提供幫助。

謝謝

猜測一下,因為問題很可能是未定義的行為,但是在代碼的其他位置:

遵守三個規則。 您應該有一個復制構造函數和賦值運算符。 如果您使用的是std容器,或者進行復制或賦值,而沒有這些容器,則在刪除析構函數中的內存時會遇到麻煩。

在我看來, CRTConvolver默認構造函數(用於創建數組)正在寫入它不擁有的內存。 如果Intel編譯器具有不同的類布局規則(或數據對齊規則),則可能是在掩蓋Microsoft編譯器規則下良性的錯誤。

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

更新以響應代碼更新:

CRTConvolver類包含Buff四個實例,因此我懷疑這是問題所在。 可能是版本不匹配CRTConvolver類認為Buff小於實際大小。 我建議您重新編譯所有內容並重新聯系我們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM