0

CStringクラスに動的配列があり、クラスnewのコンストラクターで演算子を使用してそれを作成したので、メモリを解放するためにデストラクタに1行書きました。エラーは発生しませんが、実行時にブレークポイントが発生します。エラーは次のとおりです。WindowsがGeneticAlgorithm.exeでブレークポイントをトリガーしました。

これは、ヒープの破損が原因である可能性があります。これは、GeneticAlgorithm.exeまたはロードされたDLLのいずれかにバグがあることを示しています。

これは、GeneticAlgorithm.exeにフォーカスがあるときにユーザーがF12キーを押したことが原因である可能性もあります。

出力ウィンドウには、より多くの診断情報が表示される場合があります。

コードは次のとおりです。

//in constructor
StringFormat = new CString[Info.VariablesCount + 1];
for (int i=0;i<=Info.VariablesCount;i++)
     StringFormat[i] = "%2.3f";`

// in destructor
free(StringFormat);

これはクラスのプライベートメンバーであることに注意してくださいStringFormat*。このクラスには他にもいくつかの動的配列がありますが、freeメソッドを使用して簡単に解放できます。この問題はCString動的配列だけにあるので、何が欠けていますか?

4

3 に答える 3

2

以前はアレイnew[]を割り当てていました。CStringあなたはdelete[]それを解放するために使用しなければなりません-基本的なC++メモリルール。

デストラクタの使用:delete[] StringFormat;

于 2012-07-15T23:54:59.810 に答える
1

を使用して文字列を削除することは別delete[] StringFormatとして、3つのルールに従う必要があります

  • コピーコンストラクターを提供する
  • 代入オーバーロード関数を提供する

これを確認してください。

于 2012-07-16T06:14:12.747 に答える
1

演算子を使用newしてメモリを割り当て、を使用してメモリを解放しようとしましたfree。いくつかのセマンティクスが異なることを除いて、両方に異なるヒープがあります。を使用して割り当て、を使用してnewメモリを解放しますdelete。同様に、を使用して割り当て、を使用mallocして同じものを解放しfreeます。それらを混ぜることはできません!

また、他の人が述べているように、new(スケーラーではなく)配列モードを使用する場合は、スカラーではなくnew配列モードを使用して削除する必要があります(つまり、ではなく)。deletedeletedelete[]delete

自分で管理するのではなく、、、、またはその他のコンテナを使用して文字列の配列を設定することvectorを強くお勧めします。listCArrayCStringArray

于 2012-07-16T07:51:50.417 に答える