我工作的這個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。 如果我切換回微軟編譯器,即使在編譯和運行完全相同的版本以前可以無誤地運行時,情況也會保持不變....
我無法強調在安裝英特爾編譯器之前一切都運行得很好,是否有可能出現問題或者某處存在不兼容問題?
我真的運行的想法在這裏,我希望有人能夠幫助。
感謝
您是否在「Buff」類中添加了新變量?在這種情況下,你應該重建一次。 – Naveen 2012-07-16 12:16:04
與您的問題無關,但不應將值(例如緩衝區長度)設置爲NULL,因爲它只能用於指針。技術上它將在長度字段中設置爲零,而使用逐字'0'代替更具可讀性。 – 2012-07-16 12:17:34
請發佈完整但重現問題的最小代碼。 – 2012-07-16 12:22:48