我工作的这个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