奇怪的英特尔 C++ 编译器错误

问题描述 投票:0回答:2

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

我无法强调这样一个事实:在安装英特尔编译器之前,一切都运行得很好,是否有可能出现问题或某个地方不兼容?

我真的没有什么想法了,我希望有人能够提供帮助。

谢谢

c++ visual-studio-2010 intel icc heap-corruption
2个回答
0
投票

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

遵守三法则。你应该有一个复制构造函数和赋值运算符。如果您正在使用

std
容器,或者进行复制或赋值,如果没有这些容器,您在析构函数中删除内存时就会遇到麻烦。


0
投票

在我看来,

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

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

已更新以响应代码更新:

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

© www.soinside.com 2019 - 2024. All rights reserved.