我正在研究这个 VST 卷积插件(Windows 7 64bit,VS2010),我决定尝试使用 Intel c++ 编译器。我正在优化算法,所以我有一个备份项目,以防万一出现任何问题,我正在做一个实验。这两个项目都可以毫无问题地编译和运行。安装英特尔编译器后,虽然我正在试验的项目会导致堆损坏错误,所以我开始调试以追踪问题,但我找不到导致它的代码行,因为堆损坏错误在期间未触发执行但在 DLL 终止之后(调试器也没有显示访问冲突)。
在这一点上,我开始剪切部分代码以查看是否可以隔离问题,并且我发现(显然)这是我正在尝试的类。现在出现了奇怪的部分:我可以更改方法中的代码,但是一旦我将一个变量添加到备份类(工作正常的那个),即使是一个 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 和 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();
}
基本上,如果创建和销毁此类,则绝对不会执行任何操作,它仅包含长度和 buff 变量。如果我也绕过这两个变量初始化,堆错误就会消失。
该软件在 CRTConvolver 类的简单构造和随后的破坏中崩溃,即使它所做的一切都没有,这对我来说真的没有意义......
作为旁注,我创建了我的 CRTConvolver 类,如下所示:
ConvEng = new CRTConvolver[NCHANNELS];
如果我这样声明:
CRTConvolver ConvEng[NCHANNELS];
我收到关于变量 ConvEng 的堆栈损坏错误。如果我切换回 Microsoft 编译器,即使编译和运行之前可以无错误运行的完全相同的版本,情况也会保持不变......
我怎么强调都不过分,在安装英特尔编译器之前,一切都运行良好,是否有可能出现问题或某处不兼容?
我真的在这里没有想法,我希望有人能够提供帮助。
谢谢