我正在研究这个VST卷积插件(Windows 7 64位,VS2010),我决定尝试使用英特尔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();
}
基本上这个类如果创建和销毁绝对没有,它只包含长度和buff变量。如果我也绕过这两个变量初始化,那么堆错误就会消失。
软件崩溃了简单的构造和随后的类CRTConvolver的破坏,即使它没有做什么,这是对我来说真的没有意义的部分......
作为旁注,我创建了我的CRTConvolver类:
ConvEng = new CRTConvolver[NCHANNELS];
如果我这样声明:
CRTConvolver ConvEng[NCHANNELS];
我在变量ConvEng周围出现堆栈损坏错误。 如果我切换回Microsoft编译器,即使在编译和运行可以在没有错误之前运行的完全相同的版本时情况也保持不变....
我无法强调这样一个事实,即在安装英特尔编译器之前,一切运行正常,是否可能出现问题或某处存在不兼容性?
我在这里真的没有想法,我希望有人能够提供帮助。
感谢
答案 0 :(得分:0)
猜测,因为问题很可能是未定义的行为,但在代码的其他地方:
遵守三级规则。你应该有一个复制构造函数和赋值运算符。如果您正在使用std
个容器,或进行复制或分配,如果您删除了析构函数内的内存,则不会出现这些问题。
答案 1 :(得分:0)
在我看来,CRTConvolver
默认构造函数(用于创建数组)正在写入它不拥有的内存。如果英特尔编译器具有不同的类布局规则(或数据对齐规则),则可能会取消屏蔽Microsoft编译器规则下的良性错误。
CRTConvolver
类是否包含Buff
类的任何实例?
已更新以响应代码更新:
CRTConvolver
类包含四个Buff
实例,所以我怀疑这就是问题所在。它可能是版本不匹配 - CRTConvolver
类认为Buff
小于实际值。我建议你重新编译一切并回复我们。