4

ヘッダー ファイルに次のような配列を作成しています。

double (*arrayName)[b][c];

そして、cpp ファイルで次のように割り当てます。

arrayName= new double[a][b][c];

ここで、a、b、および c は、扱っているデータのサイズに基づく定数です。

この配列の割り当てを解除するにはどうすればよいですか? 3 次元配列の割り当て解除 で提案を試みましたが、「警告 C4154: 配列式の削除; 指定されたポインターへの変換」というメッセージが表示され、ヒープ破損エラーが発生します。

再利用されているが、元のコードとできるだけ同じままにする必要があるレガシーコードで作業しているため、ベクターに変更しないことをお勧めします。作業中のデータの規模がスタックをオーバーフローしていたため、静的割り当ての使用から新規/削除に変更する必要がありました。

編集: WhozCraig の方法は正しいようです。この配列 (および同様の配列) の割り当てを解除する方法が問題だと思っていましたが、コードに別の問題があることに気付きました。私はそれを修正したと思います。プログラムの再実行が完了したら、また報告します (少なくとも 1 日か 2 日かかります)。回答してくださった皆様、ありがとうございました。

編集2:まだ100%機能していませんが、問題はこの質問の範囲外であり、いくつかの値を微調整して、仕事を完了するのに十分なほどうまく機能させることができました. 回答してくれたすべての人にもう一度感謝します。

4

1 に答える 1

10

これには vector-delete が機能するはずです。

static const int b = 10;
static const int c = 10;
double (*arrayName)[b][c] = NULL;
arrayName = new double[10][b][c];
delete [] arrayName;

これをこのように動的かつ即座に割り当てる必要があり、デストラクタが正しく起動されていることを証明したい場合...

#include <iostream>
using namespace std;

class MyObj
{
public:
    MyObj() : val(1.0) {};
    ~MyObj() { cout << "~MyObj()" << endl;}

private:
    double val;
};

int main()
{
    static const int b = 3;
    static const int c = 3;
    MyObj (*arrayName)[b][c] = NULL;
    arrayName = new MyObj[3][b][c];
    delete [] arrayName;
    return 0;
}

次の出力が得られます (カウントしないでください。27 個あります)。

~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
~MyObj()
于 2012-10-02T17:53:38.697 に答える