12

ネストされた大量の for ループから抜け出す必要があるプログラムがあります。これまでのところ、ほとんどの人がそうするように私に言っている方法は、私のコードで醜い goto を使用することです。

ここで、ローカル スタックの束を作成すると (そうでない場合は、新しいコマンドを使用せずに通常の変数を意味すると思います)、変数をループ内に作成し、プログラムが goto をトリガーする if ステートメントにヒットすると、プログラムが多くのループを不適切に終了し、ローカル変数をクリーンアップしないために、メモリ リークが発生することはありますか?

4

10 に答える 10

20

いいえ、メモリ リークは発生しません。a を使用することgotoは、「ループを不適切に終了する」ことではありません。コード構造の観点からは、一般的にはお勧めできません。

それはさておき、ループを終了すると、ローカル変数はスコープ外になり、プロセス内でスタックから取り出されます (つまり、クリーンアップされます)。

于 2009-08-11T02:28:45.577 に答える
6

スタック変数 (autobot ではなく autos) は、new() や malloc() によって割り当てられた変数のように「リーキー」ではありません。

gotosの「醜さ」に関しては、独断的です。クヌースを読んでください、彼はダイクストラと同じくらい優秀でした。http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdfパスタ ベースのプログラミングは避けてください。

ダイクストラは、goto でできることのほとんどが他の構造化プログラミング手法で実行でき、使用するコードが少なくなるため、他の構造化プログラミングのエラーが発生しにくくなるため、それらを好まなかった。

goto が最初の解決策であってはならないことを理解してください。break ステートメントは、「goto を使用しないでください」という命令を厳密に遵守することが意味をなさない場合のために設計された、変装した goto にすぎません。

于 2009-08-11T02:52:38.237 に答える
2

いいえ。動的に割り当てられたメモリのみをリークできます。

于 2009-08-11T02:27:31.773 に答える
2

スタック変数は、関数に入った瞬間に定義 (および割り当て) され、関数を終了した瞬間に暗黙的に削除されます (コール スタック レコード全体がポップされるため)。関数内でいくら跳ね返っても、常に割り当てられているメモリに大混乱を引き起こす可能性はありません。コードの実行パスに関係なく、制御が呼び出し元の関数に戻るとスタック レコードがポップされ、メモリが解放されます。

于 2009-08-11T02:27:53.020 に答える
1

Goto は常に悪いわけではありませんが、あなたの場合はおそらく goto を使用すべきではありません。

goto の適切な使用例をここここで参照してください。

スコープ外のラベルに移動すると、スタック上のオブジェクトが解放されます。

例:

#include <iostream>
using namespace std;

class A
{
public:
  ~A() 
  {
     cout<<"A destructor"<<endl;
  }
};



int main(int argc, char**argv)
{
  {
    A a;
    cout<<"Inside scope"<<endl;
    goto l;
    cout<<"After l goto"<<endl;
  }

  cout<<"Outside of scope before l label"<<endl;

l:
  cout<<"After l label"<<endl;
  return 0;
}

これは印刷されます:

スコープ内
デストラクタ
l ラベルの後

于 2009-08-11T02:28:16.467 に答える
1

他の答えは本当です....ただし、ループを別の方法でネストする必要がある場合は、ループをそこに配置する設計に疑問があります。そのロジックを個別の関数に分割することは、このような問題を解決するためのより良い方法です。

ビリー3

于 2009-08-11T02:30:21.347 に答える
0

いいえ、しません。

ただし、外部リソースが適切に解放されていることを確認してください。たとえば、ファイルを開いた場合、通常は閉じられる場所にジャンプすることができます。

于 2009-08-11T02:27:19.573 に答える
0

いいえ。ローカル変数を個別にクリーンアップする必要はありません。スタックがポップすると、すべてのローカル変数が一緒に消えます。

于 2009-08-11T02:27:28.700 に答える
0

いいえ、goto ステートメントでループを抜け出しても、ループ内の自動変数によってプログラミング リークが発生することはありません。

于 2009-08-11T02:29:41.020 に答える
0

バックワード goto はリソースをリークしますか? または、以下のコードに関するその他の潜在的な問題はありますか?

再実行:

        try
        {
            //Setup request
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            ....

            //Get Response
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

           if(response != HttpStatus.OK && noOfRetries < 3)
            {
                noOfRetries++;
                Thread.Sleep(10 * 1000);


                response.Close();
                goto Reexecute;
            }
            ...

            response.Close();
         }
         catch
         {

         }
于 2010-12-03T07:01:07.447 に答える