1

我正在研究这个 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 编译器,即使编译和运行之前可以无错误运行的完全相同的版本,情况也会保持不变......

我怎么强调都不过分,在安装英特尔编译器之前,一切都运行良好,是否有可能出现问题或某处不兼容?

我真的在这里没有想法,我希望有人能够提供帮助。

谢谢

4

2 回答 2

0

猜测,因为问题很可能是未定义的行为,但在代码中的其他地方:

遵守三法则。您应该有一个复制构造函数和赋值运算符。如果您正在使用std容器,或者制作副本或分配,那么如果您在析构函数中删除内存,那么您会遇到麻烦。

于 2012-07-16T12:19:05.087 回答
0

在我看来,CRTConvolver默认构造函数(用于创建数组)正在写入它不拥有的内存。如果 Intel 编译器有不同的类布局规则(或数据对齐规则),它可能会揭露一个在 Microsoft 编译器规则下是良性的错误。

该类是否CRTConvolver包含该类的任何实例Buff

更新以响应代码更新:

该类CRTConvolver包含 的四个实例Buff,所以我怀疑这就是问题所在。这可能是版本不匹配——CRTConvolver班级认为它Buff比实际小。我建议您重新编译所有内容并与我们联系。

于 2012-07-16T12:52:02.370 回答