2

開発者が作成した 4D プログラミング言語で作成されたメモリ リークの例は何ですか?

開発者によって作成されたメモリ リークは、より適切なプログラミングで回避できたはずの、不適切なプログラミングによって作成されたメモリ リークを指しています。


32ビット

32 ビット アプリケーションで実行すると、2^32 バイト (4 GB) を超えるメモリを割り当てようとすると、最終的にクラッシュするはずです。Mac OS X プラットフォームの場合、以下のクラッシュ レポートの下部にVM Region Summary約 3.7 GB のメモリ値が表示されます。

合計 3.7G


64ビット

64 ビット アプリケーションで実行すると、コードは割り当てられたメモリの量を増やし続け、横ばいにはなりません。そのような状況では、OS は最終的にメモリが不足していると文句を言います。 イムグル

4

1 に答える 1

5

概要

開発者が独自のメモリ リークを作成する方法は多数あります。避けたいことのほとんどは、ここにリストされています。

  • CLEAR VARIABLE変数の使用が終了したときに使用
  • CLEAR SETセットの使用
  • CLEAR NAMED SELECTION名前付きセレクションの使用
  • CLEAR LISTリストの使用
  • BLOBの使用が完了したら、BLOBのサイズを0に変更するSET BLOB SIZEか、使用しますCLEAR VARIABLE
  • 配列の使用が終了したら、配列のサイズを 0 に変更するか、、 、 などCLEAR VARIABLE の開いている XML ツリーを閉じることを忘れないでください( 、)XMLDOMSVGDOM CLOSE XMLSVG_CLEAR
  • を使用する場合は、ODBC常に使用して接続を解放することを忘れないでくださいODBC_SQLFreeConnect
  • 使用されているオフスクリーン領域を必ずクリーンアップしてください

開発者が作成したメモリ リークの 2 つの具体例を次に示します。

XML を閉じるのを忘れる

悪いコード:

Repeat 
  $xmlRef:=DOM Create XML Ref("root")
Until (<>crashed_or_quit)

上記のコード スニペットでは、 を呼び出すたびDOM CREATE XML REFにメモリ ロケーションへの新しい参照が作成されるため、メモリ リークが発生しますが、このコードの開発者はメモリを解放するための呼び出しを含めることを怠っています。これを 32 ビット ホスト アプリケーションのループで実行すると、最終的にクラッシュが発生します。

固定コード:

DOM CLOSE XMLこのコードは、XML 参照が終了したときにを呼び出すことで簡単に修正できます。

Repeat 
  $xmlRef:=DOM Create XML Ref("root")   
  DOM CLOSE XML($xmlRef)  
Until (<>crashed_or_quit)  

リストをクリアするのを忘れる

悪いコード:

Repeat 
   $listRef:=New list
Until (<>crashed_or_quit)

上記のコード スニペットでは、 が呼び出されるたびNEW LISTにメモリ内の新しい場所への参照が返されるため、メモリ リークが発生します。開発者は、コマンドを使用して、参照された場所のメモリをクリアすることになっていますCLEAR LIST($listRef)。おまけとして、リストにサブリストが添付されている場合、 の*ようなパラメーターを渡すことでサブリストをクリアできますCLEAR LIST($listRef;*)

固定コード:

CLEAR LIST($listRef;*)これは、次の修正例に示すように呼び出すことで簡単に修正できます。

Repeat 
   $listRef:=New list
   CLEAR LIST($listRef;*)
Until (<>crashed_or_quit)
于 2016-02-26T00:39:36.097 に答える