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