3

イントロとして、私はVisual Studio2010でC++を使用しており、x64用にコンパイルしています。2次元配列を使用して、制御できないCスタイルの関数を実行するためのデータを格納するプログラムがあります。

float **results;
results = new float*[rows];
for (int i = 0; i < rows; ++i){
    results[i] = new float[columns];
}

int **data;
data = new int*[rows];
for (int i = 0; i < rows; ++i){
    data[i] = new int[columns];
}

//send data to the function and populate results with values
ExternalFunction(*data, *results);

//delete everything
for (int i = 0; i < rows-1; ++i){
    delete [] &results[i];
    delete [] &data[i];
}
delete [] results;
delete [] data;

これにより、VS10は_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)でデバッグアサーションエラーを通過します。これは、削除を含む最後の数行で実際に何が起こっているかに関係なく、プログラムの終わりまでに発生します。これは正確にはどういう意味ですか?私は何が間違っているのですか?とてもシンプルな気がしますが、このコードをずっと見てきました。

--編集---dasblinkenlightが私の脳に役立つナッジのおかげで、問題は解決しました!

float *results = new float[rows * columns];
float *data = new float[rows * columns];

ExternalFunction(&data[0], &results[0]);

delete [] results;
delete [] data;
4

2 に答える 2

2

アドレスのアドレスをに渡そうとしているため、コードがクラッシュしますdelete[]。これは、割り当てたものではありません。コードを次のように変更します。

for (int i = 0; i < rows ; ++i){
    delete [] results[i];
    delete [] data[i];
}

クラッシュしなくなります。

これに関するルールは単純です。の結果をに割り当てたのでnew[..]、にではなく、をresults[i]渡す必要があります。同じことが。results[i]&results[i]delete []data

また、このコードは、最後の行を含め、割り当てたすべての行を削除することに注意してください(ループ条件はi < n、ではなく、になりましたi < n-1)。ありがとうbjhend!

于 2012-04-19T01:39:12.973 に答える
0

以下を、行数が事前定義された2D配列のマクロまたは削除関数として使用できます。

for_each(results, results + rows , [](int* row) { delete[] row; });
delete[] results;
于 2016-07-19T10:01:57.867 に答える