0

これはばかげた質問のように聞こえるかもしれませんが、この場合、メモリを適切に解放する方法に関する情報が見つかりませんでした。

aを返す関数があると仮定しますdouble*(この関数について利用できる他の情報はありません)。さらに、次のユースケースを想定します。

for (int i = 0; i < SIZE; i++) {
    double *ptr = new double[3];

    /// do something with ptr, e.g., print

    // delete[] ptr;
}

上記のコメントに配置するとバックトレースが発生するため、この場合、どのようにしてメモリを正しく解放しますdelete[] ptr;か(なぜですか?)

どうもありがとう!

4

2 に答える 2

4

この機能に関する他の情報はありません

そうすると、メモリを解放する方法がわかりません。関数のソースコードがある場合はそれを確認します。そうでない場合は、作成者に連絡するか、デバッグツールを使用して、関数がどのようにメモリを割り当てるかを確認します。生のポインタは、割り当てを解除する方法を知るために必要な情報を持っていないだけです。

2番目の無関係なケースについては、delete[]が正しいので、問題は「do something」の部分にある必要があります(オーバーロードなどのトリックを実行しなかったと仮定しますnew)。

于 2012-04-21T19:35:51.443 に答える
2

やってる

double *ptr = new double[3];

delete[] ptr;

かなり正しいです。したがって、問題は別の場所に存在する必要があります。デバッガーを使用して何が起こっているかを確認することをお勧めします。Linuxシステムを使用している場合は、valgrind/helgrindを試すことをお勧めします-それはかなりいいです

于 2012-04-21T19:41:19.253 に答える