[英]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.