私はこの 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 コンパイラをインストールする前はすべて問題なく動作していたという事実をいくら強調してもしすぎることはありません。
ここで本当にアイデアが不足しています。誰かが助けてくれることを願っています。
ありがとう