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