2016-06-15 2 views
2

"FreeAndNilHttp"プロシージャでHttpオブジェクトを解放しないようにしようとしますが、FreeAndNilHttpを呼び出した後、オブジェクトはfreeおよびnilされません。 別のメソッド/プロシージャに渡される変数を無関係にすることはできませんか?Delphi nil他のメソッドのオブジェクト

コード例:

procedure FreeAndNilHttp(Http: TidHTTP); 
begin 
    Http.IOHandler.Free; 
    Http.IOHandler := nil; 
    Http.Free; 
    Http := nil; 
    // Http is in this procedure nil 
end; 

procedure TForm3.Button1Click(Sender: TObject); 
var Http: TidHTTP; 
begin 
    Http := TidHTTP.Create; 
    // ... create IOHandler and more stuff... 

    FreeAndNilHttp(Http); // <- not working 
    // Http is not nil 
end; 
+2

オブジェクトへのポインタを値渡ししています。オブジェクトは解放されますが、元のポインタはnilではありません。 –

+4

この手順を削除してHttp.Freeを書いて何が問題になりますか?とにかく消えようとしていることを何もしないようにすることに戸惑いがあるのはなぜですか。なぜあなたはIOHandlerを破壊するように強く感じるのですか? Httpを破壊しないだろうか?それとも何度も何かを吹きかけることを楽しんでいますか? –

+4

あなたのコードはCPUサイクルの無駄です。ローカル変数 'Http'はボタンクリックハンドラの終了時に範囲外になります。そのため、IOHandlerを解放して変数をnilに設定し、変数をnilに設定する(したがってFreeAndNilHttpを呼び出す)無意味です。ボタンクリックハンドラの最後にある 'Http.Free'の呼び出しは、無駄なコードとオーバーヘッドがなくても同じことを実現します。あなたは 'Http:= TIdHTTP.Create(nil);でもっと多くのことを達成します。試してみよう。最終的にHttp.Free;終わり。 –

答えて

9

Http変数の背後にあるTidHTTPインスタンスがその呼び出しの後に解放されたが、Http変数自体は確かにnilでないです。これは、変数をで渡すためです。これは、ルーチン内のHttpパラメータが同じオブジェクトを指し示すが、同じ変数を指していないことを意味する。今、あなたは参照Http変数を渡すことができ

procedure FreeAndNilHttp(var Http: TidHTTP); 

TForm3.Button1Clickで宣言さHttp変数をnilにできるようにするには、へFreeAndNilHttpルーチンの署名を変更する必要があります。

しかし、このルーチンが終了するとTForm3.Button1ClickにあるHttpの変数がなくなるため、これは不要です。

+0

ありがとうございます。私はオブジェクトが常に参照の思考によって渡されるこのケースで自分自身を混乱させた。 –

+0

はい、オブジェクトは参照渡しされます。しかし、オブジェクト(変数そのもの)への参照は、他の変数と同様に言語規則に従います。 – NGLN

+0

オブジェクトは参照渡しされます。パラメータが 'var'パラメータであれば、参照渡しされます。クラス型の変数は、オブジェクトへの参照を保持します。しかし、関数に渡すときには、値渡しの参照を渡しています。 –

関連する問題