1

私はこの VST 畳み込みプラグイン (Windows 7 64 ビット、VS2010) に取り組んでおり、インテル c++ コンパイラーを試すことにしました。私はアルゴリズムを最適化する過程にあったので、失敗した場合に備えてバックアップ プロジェクトと、実験を行っていたプロジェクトを用意しました。どちらのプロジェクトも問題なくコンパイルおよび実行されます。Intelコンパイラをインストールした後、私が実験していたプロジェクトではヒープ破損エラーが発生するため、問題を追跡するためにデバッグを開始しましたが、ヒープ破損エラーが発生しないため、問題を引き起こすコード行を見つけることができません実行されますが、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();
}

基本的に、このクラスが作成されて破棄された場合、まったく何もせず、長さとバフ変数が含まれているだけです。これら 2 つの変数の初期化もバイパスすると、ヒープ エラーはなくなります。

ソフトウェアは、クラス CRTConvolver の単純な構築とその後の破棄でクラッシュします。これは、何もしていないにもかかわらずです。これは、私には本当に意味をなさない部分です...

補足として、次のように CRTConvolver クラスを作成します。

ConvEng = new CRTConvolver[NCHANNELS];

代わりに次のように宣言すると:

CRTConvolver ConvEng[NCHANNELS];

変数 ConvEng の周りでスタック破損エラーが発生します。Microsoftコンパイラに戻すと、以前はエラーなしで実行できたのとまったく同じバージョンをコンパイルして実行しても、状況は変わりません....

Intel コンパイラをインストールする前はすべて問題なく動作していたという事実をいくら強調してもしすぎることはありません。

ここで本当にアイデアが不足しています。誰かが助けてくれることを願っています。

ありがとう

4

2 に答える 2

0

問題は未定義の動作である可能性が最も高いため、推測しますが、コードの他の場所にあります。

3のルールに従います。コピー コンストラクターと代入演算子が必要です。コンテナを使用している場合std、またはコピーや割り当てを作成している場合、これらがないと、デストラクタ内のメモリを削除すると問題が発生します。

于 2012-07-16T12:19:05.087 に答える
0

CRTConvolverデフォルトのコンストラクター(配列の作成に使用される)が、所有していないメモリに書き込んでいるように見えます。Intel コンパイラが異なるクラス レイアウト規則 (またはデータ アライメント規則) を持っている場合、Microsoft コンパイラの規則では無害だったバグを明らかにしている可能性があります。

CRTConvolverクラスにクラスのインスタンスが含まれていますBuffか?

コードの更新に対応するように更新:

CRTConvolverクラスには の 4 つのインスタンスが含まれているBuffため、そこに問題があると思われます。バージョンの不一致である可能性があります。CRTConvolverクラスは、Buff実際よりも小さいと考えています。すべてを再コンパイルして、私たちに戻ってくることをお勧めします。

于 2012-07-16T12:52:02.370 に答える